ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-20 18:04:37  阅读:163  来源: 互联网

标签:Netty 13 EventLoop 源码 事件 注册 方法


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

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

EventLoop 的粗略逻辑

  • EventLoop 的作用是一个死循环,而这个循环中做 3 件事情
  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有