IoProvider:为所有channel提供注册与取消注册
想要从SocketChannel中读取数据,但是需要使用异步的方式,需要通过观察者模式,采取注册与取消注册的方式。
当SocketChanne中的数据可读或者可取时,通过Callback进行回调处理
IoArgs:IO输出、输入参数的封装
Receiver:接收数据
Sender:发送数据
Connector:代表一次连接,封装Sender和Reciver
IoContext:通过单例创建,可以获取到唯一的IoProvider
SocketChannelAdapter:异步接收、异步发送及关闭操作的具体实现。
类图:
服务端线程图示:
运行结果:
连接10个客户端,并发送数据
服务端优化后只有四个接收线程(Input-Thread -1 /-2/ -3/ -4),pool-n-thread-1为转发线程,暂时没有优化
二、NIO vs IO
IO:以流为导向,阻塞IO
(Stream oriented、Blocking IO)
NIO:以缓冲区为导向,非阻塞IO,Selector选择器
(Buffer oriented、Non blocking IO、 Selectors)
三、阻塞IO线程处理数据
如果只要一条线程,那么,当它读取到数据 后会阻塞,它只能读取数据完成后才能读取下一条数据。
它是一条一条数据往下执行,是一个串行的过程
四、NIO线程处理数据
首先将Channel注册到Selector中,
在线程中,开始读取数据,会将它读取到Channel中,Channel会将数据填充到Buffer中。然后检查并处理该条数据。然后紧接着读取下一条数据。
它也是一个串行的过程,但是它仅在Channel有数据的时候才会执行这个流程,当没有数据的时候,是不会进行后续流程的,也就避免了数据的阻塞。
五、
通过SeverSocket的accept接收客户端的链接,每一个链接可以单独使用一个线程,也可以使用包含4个或多个线程的线程池来完成。写的操作也可以通过线程池来完成。
六、
所有链接可以通过一个线程来完成读取和写入的过程,读、写分开执行
七、
IO阻塞模式下线程之间的关系:
NIO下服务接收客户端方式:
NIO下服务端接收线程调整: