博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NIO-3网络通信
阅读量:4993 次
发布时间:2019-06-12

本文共 4140 字,大约阅读时间需要 13 分钟。

 

import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.file.Paths;import java.nio.file.StandardOpenOption;import org.junit.Test;/* * 一、使用 NIO 完成网络通信的三个核心: *  * 1. 通道(Channel):负责连接 *          *        java.nio.channels.Channel 接口: *             |--SelectableChannel *                 |--SocketChannel *                 |--ServerSocketChannel *                 |--DatagramChannel *  *                 |--Pipe.SinkChannel *                 |--Pipe.SourceChannel *  * 2. 缓冲区(Buffer):负责数据的存取 *  * 3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况 *  */public class TestBlockingNIO {    //客户端    @Test    public void client() throws IOException{        //1. 获取通道        SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));                FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);                //2. 分配指定大小的缓冲区        ByteBuffer buf = ByteBuffer.allocate(1024);                //3. 读取本地文件,并发送到服务端        while(inChannel.read(buf) != -1){            buf.flip();            sChannel.write(buf);            buf.clear();        }                //4. 关闭通道        inChannel.close();        sChannel.close();    }        //服务端    @Test    public void server() throws IOException{        //1. 获取通道        ServerSocketChannel ssChannel = ServerSocketChannel.open();                FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);                //2. 绑定连接        ssChannel.bind(new InetSocketAddress(9898));                //3. 获取客户端连接的通道        SocketChannel sChannel = ssChannel.accept();                //4. 分配指定大小的缓冲区        ByteBuffer buf = ByteBuffer.allocate(1024);                //5. 接收客户端的数据,并保存到本地        while(sChannel.read(buf) != -1){            buf.flip();            outChannel.write(buf);            buf.clear();        }                //6. 关闭通道        sChannel.close();        outChannel.close();        ssChannel.close();            }    }

 

客户端服务端的响应交互

import java.io.IOException;import java.net.InetSocketAddress;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;import java.nio.channels.ServerSocketChannel;import java.nio.channels.SocketChannel;import java.nio.file.Paths;import java.nio.file.StandardOpenOption;import org.junit.Test;public class TestBlockingNIO2 {        //客户端    @Test    public void client() throws IOException{        SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));                FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);                ByteBuffer buf = ByteBuffer.allocate(1024);                while(inChannel.read(buf) != -1){            buf.flip();            sChannel.write(buf);            buf.clear();        }                sChannel.shutdownOutput();                //接收服务端的反馈        int len = 0;        while((len = sChannel.read(buf)) != -1){            buf.flip();            System.out.println(new String(buf.array(), 0, len));            buf.clear();        }                inChannel.close();        sChannel.close();    }        //服务端    @Test    public void server() throws IOException{        ServerSocketChannel ssChannel = ServerSocketChannel.open();                FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);                ssChannel.bind(new InetSocketAddress(9898));                SocketChannel sChannel = ssChannel.accept();                ByteBuffer buf = ByteBuffer.allocate(1024);                while(sChannel.read(buf) != -1){            buf.flip();            outChannel.write(buf);            buf.clear();        }                //发送反馈给客户端        buf.put("服务端接收数据成功".getBytes());        buf.flip();        sChannel.write(buf);                sChannel.close();        outChannel.close();        ssChannel.close();    }}

 

转载于:https://www.cnblogs.com/surge/p/10476099.html

你可能感兴趣的文章
continue 和 break的实例
查看>>
Java学习笔记()ArrayList
查看>>
redis缓存清除
查看>>
django Highcharts制作图表--显示CPU使用率
查看>>
文本处理 tr ,col,join,paste
查看>>
oracle权限
查看>>
java方法的虚分派和方法表
查看>>
【转】字符串和浮点数格式化输出小结
查看>>
Android开发 - Retrofit 2 使用自签名的HTTPS证书进行API请求
查看>>
对测试人员或开发人员来说相互沟通有多重要?
查看>>
解释器、编译器以及他们之间的差别。
查看>>
MongoDB的快速手动安装
查看>>
JS制作简单的日历控件【JS Date对象操作实例演示】
查看>>
模板—树上倍增LCA
查看>>
高二小假期集训—D5
查看>>
EasyUI easyui-combobox 重复发送请求
查看>>
memcached-repcached
查看>>
[转]CentOS 5.3通过yum升级php到最新版本的方法
查看>>
UVA 11235 - Frequent values RMQ的应用
查看>>
大数据日志采集系统
查看>>