Nio线程启动的第二个过程 processSelectedKeys 检测出 accept 事件后,通过 JDK 的 accept 方法创建出 JDKchannel,然后包装为 Nio 自定义的 Channel,在过程通过 RecvByteBufAllocator.Handle 这个对象控制连接接入的速率(默认情况下读取16个连接)
image.png

NioSocketChannel的创建:

image.png
大致流程

进入 new NioSocketChannel 方法,在其构造方法中会将此Channel绑定到Selector上,表示对读事件感兴趣,后续如果有事件读写则进行告知
image.png

继续追踪,其父类中设置非阻塞模式,在父类super方法中创建此客户端Channel的服务端Channel
image.png
设置非阻塞模式

new NioSocketChannelConfig() 中禁止Nagle算法
image.png

新连接NioEventLoop的分配和Selector注册:

服务端Channel在检测到新连接,并创建完客户端Channel之后,会调用一个连接器进行处理,处理包括为客户端Channel添加ChildHandler(逻辑处理器)、配置 options 和 attrs、选择一个 NioEventLoop 进行绑定,绑定时将该Channel注册到NioEventLoop的Selector上,绑定时不关心任何事件新连接接入 - 图6

追踪 childGroup.register 方法,发现进行线程切换,拿到Java原生的SocketChannel注册事件到当前EventLoop上
image.png

NioSocketChannel读事件的注册:

触发连接Channel上的事件
image.png

开始进行事件关注
image.png