前言:
BIO、NIO的代码实践参考:Java分别用BIO、NIO实现简单的客户端服务器通信
input
和output
,输入输出数据的发送和接收
Java共支持三种I/O模型:BIO,NIO,AIO
BIO:同步阻塞
,一个线程处理一个连接。只要有一个客户端连接到服务器就需要开一个线程。同一个线程的连接和读写操作会阻塞NIO:同步非阻塞
,一个线程处理多个连接。实现方式是客户端的请求事件都会注册到多路复用器(selector)上面,多路复用器进行轮询处理AIO:异步非阻塞
,引入异步通道概念,采用Proactor模式,有效请求事件才会启动线程,特点是先由操作系统完成后才通知服务器程序启动线程,适用于连接数多的长连接请求流程:
ServerSocket
socket
与服务器通信。服务器需要对每个客户端建立一个线程主要概念:
Channel
(通道),Buffer
(缓冲区),Selector
(多路复用器)多路复用技术
,做到了一个连接并发处理多个请求,数量比HTTP1.0大了好几个数量级Channel(通道),Buffer(缓冲区),Selector(多路复用器)的关系:
- 每个Channel对应一个Buffer
- Selector对应一个线程,一个线程对应多个Channel
- Selector根据不用事件,在各个通道上切换
- Buffer是一个内存块,底层是数组,读写切换需要用flip()
- Channel是双向的,可以返回底层操作系统的情况
Channel:
- BIO的stream是单向的
- Channel是双向的,可以读也可以写
- 常见的Channel还有FileChannel,DatagramChannel,SocketChannel,ServerSocketChannel
- FileChannel:文件读写
- DatagramChannel:UDP读写
- SocketChannel,ServerSocketChannel:TCP读写
NIO编程流程:
ServerSocket
得到一个ServerSocketChannel
Selector
SelectorKey
集合,并进行轮询方案:
Selector
是网络编程API,可以实现应用程序对多路链接请求的处理多路复用器
即一个Reactor
监听所有的客户端的请求连接、读、写事件Handler
处理连接后的读写业务处理优缺点:
方案:
Selector
是网络编程API,可以实现应用程序对多路链接请求的处理Reactor
监听所有的客户端的请求连接、读、写事件worker
线程池里面的线程处理业务优缺点:
方案:
Reactor主线程
和Reactor从线程
,主线程负责处理连接事件,从线程负责处理读写事件Acceptor
处理完连接事件后,主Reactor把连接分给从Reactor处理Handler
进行处理worker线程池
里面的线程处理业务优缺点:
主要基于主从Reactor多线程
模型,做了一定的改进,增加了Reactor线程池
,可以多个主线程和多个从线程并发处理
Netty模型图(简单版)
Netty模型图(复杂版)
工作原理:
BossGroup
,WorkGroup
,分别做连接事件多路复用和网络读写事件多路复用NioEventLoopGroup
NioEventLoop
事件循环多路复用器Selector
accept
事件 b. 处理accept事件,与客户端建立连接,生成channel,并将其注册到某个WorkGroup中的NioEventLoop上的Selector c. 处理任务队列的任务,即runAllTaskread
,write
事件 b. 处理read,write事件,主要是处理channel c. 处理任务队列的任务,即runAllTaskpipeline管道
,pipeline包含了channel,pipeline维护了很多handler处理器