《Netty深入剖析》之四:新连接接入
4 Netty新连接接入
新连接接入处理逻辑:
4.1 检测新连接
流程:在3.3的processSelectedKeys方法里:创建NioSocketChannel,封装了NIO的SocketChannel
while循环条件为allocHandler.continueReading()是用来控制连接接入的速率,默认一次性最大16个连接(maxMessagePerRead),如果超过就结束;
如果没有新的连接了,就break,也结束
4.2 创建NioSocketChannel
流程:
4.2.1 Channel的分类
NioServerSocketChannel、NioSocketChannel、Unsafe
4.2.2 Channel的层级关系
NioMessageUnsafe代表读取的是连接,NioByteUnsafe代表读取的是数据
AbstractNioChannel:实现Channel大部分功能,主要是通过selector方式去处理IO事件
服务端注册accept事件,客户端注册read事件
4.3 新连接NioEventLoop分配及注册selector
- 流程
while循环结束后,接下来的代码调用ServerBootstrapAcceptpr这个连接器来处理(for)
服务端Channel的pipeline构成:
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上面去