5.Netty新连接接入

128 阅读1分钟

接入处理逻辑

image.png

回顾

  1. Netty服务端启动后会绑定一个boss线程(NioEventLoop)
  2. NioEventLoop调用run方法启动
  3. run做的第一件事就是select IO事件(即accept新连接接入事件),第二件事就是处理IO事件

检测新连接

  • 入口代码 ->processSelectedKey()
  • NioMessageUnsafe.read()
  • doReadMessages()
  • javaChannel().accept()

进入前文IO处理那里,进入NioMessageUnsafe.read(),如图一路深入就会发现jdk底层创建新连接对象,下面再包装成netty自己的channel image.png image.png image.png image.png image.png

创建NioSocketChannel

  1. new NioSocketChannel(this, ch)
  2. 在AbstractNioChannel中
  • configureBlocking(false)设置非阻塞并且保存op
  • 创建一系列组件id、unsafe、pipeline
  1. NioSocketChannelConfig中禁止了tcp的Nagle算法setTcpNoDelay(true)

进入super()会发现会设置非阻塞和保存op,并创建组件 image.png image.png image.png image.png 在NioSocketChannelConfig中禁止了tcp的Nagle算法 image.png

Channel的分类

  • NioServerSocketChannel 服务端channel
  • NioSocketChannel 新连接客户端channel
  • Unsafe 实现每种channel底层具体的协议 image.png

新连接NioEventLoop的分配

image.png image.png

NioSocketChannel读事件注册

在NioServerSocketChannel创建时这的isActive是false,故不执行下面,而此时为true

传播一个事件并注册读事件 image.png image.png