编程语言
首页 > 编程语言> > Netty网络框架学习笔记-13(Netty核心源码剖析-接受请求_2022.06.20)

Netty网络框架学习笔记-13(Netty核心源码剖析-接受请求_2022.06.20)

作者:互联网

Netty网络框架学习笔记-13(Netty核心源码剖析-接受请求_2022.06.20)

从之前服务器启动的源码中,我们得知,服务器最终注册了一个 Accept 事件等待客户端的连接。也知道, NioServerSocketChannel 将自己注册到了 bossEventLoopGroup 线程池(reactor 线程)上,也就是 EventLoop 。

EventLoop 的粗略逻辑

  1. 有条件的等待 Nio 事件。
  2. 处理 Nio 事件。
  3. 处理消息队列中的任务。

Netty 接受请求过程图解

入口: NioEventLoop#void run() => processSelectedKeys() => processSelectedKey(SelectionKey k, AbstractNioChannel ch)

XxSJQf.png

进入到 NioEventLoop 源码中后,在 NioEventLoop#processSelectedKey(SelectionKey k, AbstractNioChannel ch) 方法开始调试最终我们要分析到 AbstractNioChannel 的 doBeginRead 方法, 当到这个方法时,针对于这个客户端的连接就完成了,接下来就可以监听读事件了

Netty 接受请求过程总结

接受连接 => 创建一个新的 NioSocketChannel => 注册到一个 worker EventLoop 上 => 注册 selecot Read 事件。

  1. 服务器轮询 Accept (接收) 事件,获取事件后调用 unsafe 的 read 方法,这个 unsafe 是个接口, 其中关注的实现类 : AbstractNioMessageChannel实现的read()方法。 方法内部由 2 部分组成

  2. doReadMessages(readBuf) 用于创建 NioSocketChannel 对象,该对象包装 JDK 的 Nio Channel 客户端。该方法会像创

    建 ServerSocketChanel 类似创建相关的 pipeline , unsafe,config

  3. 随后执行 执行 pipeline.fireChannelRead(readBuf.get(i)) 方法,并将自己绑定到一个 chooser 选择器选择的 workerGroup 中的 一个 EventLoop。并且注册一个 0 事件,表示注册成功,但并没有注册读(1)事件

  4. worker子线程启动执行 register0(promise), 后面因为是首次注册, 会调用pipeline.fireChannelActive() 触发通道的 readIfIsAutoRead() 读方法 然后会增加一个读事件的监听。

1

标签:Netty,13,EventLoop,源码,事件,注册,方法
来源: https://www.cnblogs.com/zhihao-plus/p/16394169.html