接入处理逻辑
回顾
- Netty服务端启动后会绑定一个boss线程(NioEventLoop)
- NioEventLoop调用run方法启动
- run做的第一件事就是select IO事件(即accept新连接接入事件),第二件事就是处理IO事件
检测新连接
- 入口代码 ->processSelectedKey()
- NioMessageUnsafe.read()
- doReadMessages()
- javaChannel().accept()
进入前文IO处理那里,进入NioMessageUnsafe.read(),如图一路深入就会发现jdk底层创建新连接对象,下面再包装成netty自己的channel
![]()
![]()
![]()
![]()
创建NioSocketChannel
- new NioSocketChannel(this, ch)
- 在AbstractNioChannel中
- configureBlocking(false)设置非阻塞并且保存op
- 创建一系列组件id、unsafe、pipeline
- NioSocketChannelConfig中禁止了tcp的Nagle算法setTcpNoDelay(true)
进入super()会发现会设置非阻塞和保存op,并创建组件
![]()
![]()
![]()
在NioSocketChannelConfig中禁止了tcp的Nagle算法
Channel的分类
- NioServerSocketChannel 服务端channel
- NioSocketChannel 新连接客户端channel
- Unsafe 实现每种channel底层具体的协议
新连接NioEventLoop的分配
NioSocketChannel读事件注册
在NioServerSocketChannel创建时这的isActive是false,故不执行下面,而此时为true
传播一个事件并注册读事件
![]()