Java网络编程之非阻塞I/O

非阻塞I/O

本文参考了《Java网络编程案例》,若有错误的地方欢迎指出。
非阻塞I/O在编程逻辑上与阻塞I/O一致,只是把Socket、ServerSocket换成了对应的通道
Java基本I/O都是阻塞I/O,例如通过Socket来读数据,调用readLine()方法之后,如果没有数据到达,当前线程就会一直阻塞在readLine()方法中,直到有数据或者数据源关闭才返回。如果采用非阻塞I/O,当数据没有就绪时,readLine()方法立即返回,而不是让当前线程一直阻塞在readLine()方法中。
基本I/O流都是单向传输的,通道是双向的,而且通道既可以工作于阻塞模式,也可以工作于非阻塞模式。
通道通过Selector类和SelectionKey类,构建一种轮询机制,实现多通道并发模式的管理。

在这里插入图片描述
非阻塞I/O的特点:
(1)单线程。NIO选择器的轮询机制,实现了单线程管理多通道的工作模式。多通道并发,避免了一客户一线程或者线程池对CPU的开销
(2)通道技术。一类是侦听通道ServerSocketChannel,另一类是数据通道SocketChannel。侦听通道只处理连接,所有客户机都需要通过侦听通道连接到服务器,在连接成功的同时,侦听通道开通一个为客户服务的数据通道。数据通道只负责数据传输,与客户机一一对应。
(3)缓冲区技术。NIO是基于通道和缓冲区进行操作,数据总是从通道写入到缓冲区中,或者从缓冲区读取到通道中。
(4)选择器。JavaNIO引入了选择器的概念,选择器用于侦听多个通道的事件,例如连接到达、数据到达等,这也是单线程可以管理多数据通道的关键。选择器就像uohe调度机构,所有的通道,都要向选择器注册,选择器会向每个通道颁发一个令牌,令牌是用SelectionKey类来定义的。
(5)令牌。每个通道都跟有一个SelectionKey,这是通道向选择器注册时创建的令牌,专为沟通当前通道和选择器服务。当侦听通道中有连接到达时,该通道所属令牌就会设置其OP_ACCEPT字段的值位就绪,当数据通道有数据到达事件发生时,该通道所属令牌就会设置其OP_READ字段的值为就绪,在每个选择器轮询周期,选择器通过查阅各令牌的状态决定调度和运行策略。

代码链接:
https://github.com/hzulwy/private-project/blob/master/%E9%9D%9E%E9%98%BB%E5%A1%9EIO.rar

发布了61 篇原创文章 · 获赞 0 · 访问量 902

猜你喜欢

转载自blog.csdn.net/qq_36828822/article/details/103447865