使用的 netty 版本是:4.1.30.Final-SNAPSHOT
1. netty 服务端有 boss 线程组和 worker 线程组,经调试发现,boss 线程组处理连接事件,而 worker 线程组处理 IO 读事件,两个线程组的代码是同一份 NioEventLoop,到底在哪对事件进行了区分?
很可能是 :
io.netty.channel.nio.AbstractNioChannel#doRegister
2. netty 的 channelPipeline
channelPipeline 添加了各种 ChannelHandler,这些 handler 分为 inbound 和 outbound 两种类型,这些 handler 的执行顺序是怎样的?
io.netty.channel.AbstractChannelHandlerContext#findContextInbound
io.netty.channel.AbstractChannelHandlerContext#findContextOutbound
实际构成链的是 AbstractChannelHandlerContext,有的方法遍历方向是从 head 往后,有的是从 tail 向前。
在自定义 ChannelHandler 的 channelRead 方法中加断点,得到的调用栈如下图:
fireChannelRead,invokeChannelRead,channelRead 构成了递归调用,channelRead 方法中执行 ctx.fireChannelRead 过渡到下一个 handler。netty 从 socket 读取数据,然后按顺序经过 inbound 的 handler。
read data -> inbound 1 -> inbound 2 -> ... -> inbound N
write data -> outbound N -> ... -> outbound 2 -> outbound 1
3. write 和 writeAndFlush
ChannelFuture f = b.connect(HOST, PORT).sync();
f.channel().write("1xx");
write 并不会真的发送数据,它只是把数据添加到 ChannelOutboundBuffer 中。