Java-NIO-网络通信-阻塞

使用NIO完成网络通信的三个核心
 * 1. 通道(Channel):负责连接
 *        java.nio.channels.Channel 接口:
 *             |--SelectableChannel
 *                 |--SocketChannel
 *                 |--ServerSocketChannel
 *                 |--DatagramChannel
 *
 *                 |--Pipe.SinkChannel
 *                 |--Pipe.SourceChannel
 *
 * 2. 缓冲区(Buffer):负责数据的存取

 * 3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况

@Test
	 public void client() throws IOException{
		 //1.获取通道
		 SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1",9898));
		 
		 FileChannel channel = FileChannel.open(Paths.get("Java.pdf"),StandardOpenOption.READ);
		 
		 //2.分配指定大小的缓冲区
		 ByteBuffer buf = ByteBuffer.allocate(1024);
		 
		 //3.读取本地文件并发送到客户端
		 while((channel.read(buf))!=-1){
			 buf.flip();
			 socketChannel.write(buf);
			 buf.clear();
		 }
		 
		 //4.接收服务端的反馈
		 socketChannel.shutdownOutput();
		 
		 int len = 0;
		 while((len = socketChannel.read(buf))!=-1){
			 buf.flip();
			 System.out.println(new String(buf.array(),0,len));
			 buf.clear();
		 }
		 
		 //5.关闭通道
		 channel.close();
		 socketChannel.close();
	 }
	 
	 @Test
	 public void server() throws IOException{
		 
		 //1.获取通道
		 ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
		 
		 FileChannel fileChannel = FileChannel.open(Paths.get("JavaCopy.pdf"),StandardOpenOption.WRITE,StandardOpenOption.CREATE);
		 
		 //2.绑定连接
		 serverSocketChannel.bind(new InetSocketAddress(9898));
		 
		 //3.获取客户端连接通道
		 SocketChannel scChannel = serverSocketChannel.accept();
		 
		 //4.分配缓冲区
		 ByteBuffer buf = ByteBuffer.allocate(1024);
		 
		 //5.接收并保存到本地
		 while (scChannel.read(buf)!=-1) {
			 buf.flip();
			 fileChannel.write(buf);
			 buf.clear();
		 }
		 
		 //6.发送反馈给客户端
		 buf.put("服务端接收数据成功...".getBytes());
		 buf.flip();
		 scChannel.write(buf);
		 
		 //7.关闭通道
		 scChannel.close();
		 fileChannel.close();
		 serverSocketChannel.close();
	 }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值