《Netty深入剖析》之四:新连接接入

4 Netty新连接接入

新连接接入处理逻辑:
《Netty深入剖析》之四:新连接接入

4.1 检测新连接

流程:在3.3的processSelectedKeys方法里:创建NioSocketChannel,封装了NIO的SocketChannel
《Netty深入剖析》之四:新连接接入
while循环条件为allocHandler.continueReading()是用来控制连接接入的速率,默认一次性最大16个连接(maxMessagePerRead),如果超过就结束;
如果没有新的连接了,就break,也结束

4.2 创建NioSocketChannel

流程:
《Netty深入剖析》之四:新连接接入

4.2.1 Channel的分类

NioServerSocketChannel、NioSocketChannel、Unsafe

4.2.2 Channel的层级关系

《Netty深入剖析》之四:新连接接入
NioMessageUnsafe代表读取的是连接,NioByteUnsafe代表读取的是数据

AbstractNioChannel:实现Channel大部分功能,主要是通过selector方式去处理IO事件

服务端注册accept事件,客户端注册read事件

4.3 新连接NioEventLoop分配及注册selector

  • 流程

while循环结束后,接下来的代码调用ServerBootstrapAcceptpr这个连接器来处理(for)

服务端Channel的pipeline构成:
《Netty深入剖析》之四:新连接接入
ServerBootstrapAcceptpr工作:

1.添加childHandler()方法添加的handler

2.设置options和attrs

3.选择NioEventLoop并注册selector(doRegister()),这时候不关心任何事件

4.4 向selector注册读事件

流程:doRegister()之后的if(isActive())会为true,调用代码块里的beginRead(),会调用doBeginRead()(服务端也会调用),注册OP_READ

4.5 总结

  • Netty是在哪里检测有新连接接入的?

4.1:boss线程的第一个过程(轮询出accept事件)和boss线程的第二个过程(通过JDK底层的channel的accept方法去创建这条连接)

  • 新连接是怎样注册到NioEventLoop线程的?

4.3:boss线程调用chooser的next方法,拿到一个NioEventLoop,然后将这条连接注册到NioEventLoop的selector上面去