BIO网络模型

BIO网络模型中,服务端在没接收到一个客户端的连接请求后都会建立一个新的线程去监听客户端,在高并发的网络环境下,就会导致建立大量的线程,最终导致性能瓶颈甚至服务器崩溃。
缺点:阻塞式I/O模型、弹性伸缩能力差、多线程资源消耗大。
NIO网络模型

NIO网络模型优点:非阻塞I/O模型、弹性伸缩能力强、单线程节省资源。
在之前的Java I/O系统中已经介绍了NIO的三个关键组件:Channel、Buffer、Selector,接下来,再将将它们在网络编程中的应用。
Channel
Channel是信息传输的通道,具有双向性、非阻塞性、操作唯一性。其中操作唯一性是指NIO中只能使用Buffer操作Channel。
JDK中有四个关键的实现类:1. 文件类 FileChannel、2. UDP类 DatagramChannel、3. TCP类:ServerSocketChannel/SocketChannel。
//1. 服务器端打开ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//2. 服务器端绑定8080端口
serverSocketChannel.bind(new InetSocketAddress(8080));
//3. 服务器端监听端口,当收到请求时,返回SocketChannel实例
SocketChannel socketChannel = serverSocketChannel.accept();
//4. 客户端的请求代码
SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8080));
发现上述代码和BIO的TCP建立十分类似。
Buffer
Buffer的作用就是从Channel交换数据,它在本质上是一块swap内存。
Buffer的四个重要属性:Capacity、Position、Limit、Mark。
其简单使用方法在(1)中讲过,这里不再赘述。
Selector
Selector,选择器又称多路复用器,是NIO网络编程的基础,其作用是I/O就绪选择。
//1. 创建Selector
Selelctor slector = Selector.open();
//2. 将channel注册到Selector上,监听就绪事件
SelectionKey selectionKey = channel.register(Selector, SelectionKey.OP_Read);
//3. 阻塞等待就绪事件发生
int selectNum = selector.select();
//4. 获取发生就绪事件的channel集合
Set<SelectionKey> selectedKeys = selector.selectedKeys();
SelectionKey是一个静态常量,它提供了四种就绪状态常量,分别是connect、except、read、write。在调用selector.selelctedKeys() 方法时,会返回一个SelectionKey的集合
网友评论