接收连接请求的处理本质是对 OP_ACCEPT 的处理,即在 NioEventLoop 中,因为注册到了NioEventLoop的 selector。 分别调试启动 EchoServer 和 EchoClient
最后观察下 server 的日志信息
// 阻塞轮询。非阻塞轮询。超时等待轮询
selector.select()/ selectNow()/select(timeoutMillis) 发现 OP_ACCEPT 事件,处理:
SocketChannel socketChannel = serverSocketChannel.accept()
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this);
selectionKey.interestOps(OP_READ);
创建连接的初始化和注册是通过pipeline.fireChannelRead
在ServerBootstrapAcceptor
中完成
第一次Register并非监听OP_READ
,而是0
selectionKey = javaChannel().register(eventLoop().unwrappedSelector(), 0, this)
最终监听OP_READ
是通过"Register"完成后的fireChannelActive
(io.netty.channel.AbstractChannel.AbstractUnsafe#register0)触发
Worker’s NioEventLoop是通过Register操作执行来启动。
接受连接的读操作,不会尝试读取更多次(16次)。 因为无法知道后续是否还有连接,不可能一直尝试。