在Nio线程启动的第二个过程 processSelectedKeys 检测出 accept 事件后,通过 JDK 的 accept 方法创建出 JDKchannel,然后包装为 Nio 自定义的 Channel,在过程通过 RecvByteBufAllocator.Handle 这个对象控制连接接入的速率(默认情况下读取16个连接)
NioSocketChannel的创建:
大致流程
进入 new NioSocketChannel 方法,在其构造方法中会将此Channel绑定到Selector上,表示对读事件感兴趣,后续如果有事件读写则进行告知
继续追踪,其父类中设置非阻塞模式,在父类super方法中创建此客户端Channel的服务端Channel
设置非阻塞模式
在 new NioSocketChannelConfig() 中禁止Nagle算法
新连接NioEventLoop的分配和Selector注册:
服务端Channel在检测到新连接,并创建完客户端Channel之后,会调用一个连接器进行处理,处理包括为客户端Channel添加ChildHandler(逻辑处理器)、配置 options 和 attrs、选择一个 NioEventLoop 进行绑定,绑定时将该Channel注册到NioEventLoop的Selector上,绑定时不关心任何事件
追踪 childGroup.register 方法,发现进行线程切换,拿到Java原生的SocketChannel注册事件到当前EventLoop上
NioSocketChannel读事件的注册:
触发连接Channel上的事件
开始进行事件关注