Netty学习笔记
Java NIO
https://www.javadoop.com/post/java-nio
三大组件
Buffer
本质是内存中的一块,将数据写入这块内存,从这块内存获取数据
核心是ByteBuffer,也最常使用
Channel
通道,数据来源或数据写入的目的地
与Buffer打交道,读操作时将Channel的数据填充到Buffer中,写操作将Buffer的数据写入Channel。
读操作:
channel.read(buffer)
写操作:
channel.write(buffer)
Selector
多路复用,一个线程管理多个Channel
将Channel注册到Selector上(带上需要监听的事件类型s)
四种事件:
- SelectionKey.OP_READ 对应 00000001,通道中有数据可以进行读取
- SelectionKey.OP_WRITE 对应 00000100,可以往通道中写入数据
- SelectionKey.OP_CONNECT 对应 00001000,成功建立 TCP 连接
- SelectionKey.OP_ACCEPT 对应 00010000,接受 TCP 连接
ServerSocketChannel不和Buffer交互,不处理实际数据,一旦接收到请求后,实例化SocketChannel,之后在这个连接通道上的数据传递它就不管了,继续监听端口,等待下一个连接。
1 | ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); |
Java的非阻塞IO和异步IO
https://www.javadoop.com/post/nio-and-aio
简单地说,ServerSocketChannel、Selector这种多路复用的,是非阻塞,non-blocking。
AsynchronousServerSocketChannel是异步的,有Future和回调函数两种方式。
Netty
Channel
Future和Promise
Pipeline和Inbound、Outbound
EventLoopGroup和EventLoop
Netty线程池指NioEventLoopGroup,线程池中的单个线程是NioEventLoop。