5. Java NIO系列之阻塞式IO

来源:互联网 发布:format java 编辑:程序博客网 时间:2024/06/02 05:07

使用  NIO  完成网络通信的三个核心:

1.   通道(channel):负责连接

java.nio.channels.Channel 接口:
  |--SelectableChannel
  |--SocketChannel
  |--ServerSocketChannel
  |--DatagramChannel
 
  |--Pipe.SinkChannel
  |--Pipe.SourceChannel

2.   缓冲区(Buffer):负责数据的存取

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


例子一:客户端向服务器发送数据,将数据保存。

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 TestBlockingNIO {//客户端@Testpublic 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();}//服务端@Testpublic 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 {//客户端@Testpublic 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();}//服务端@Testpublic 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();}}



0 0
原创粉丝点击