以下所绘制图形均基于Netty4.0.28版本。

一、connect(outbound类型事件)

当用户调用channel的connect时,会发起一个outbound类型的事件,该事件将在pipeline中传递(pipeline.connect),首先由tail handler处理,该handler只是将事件透传给下一个outbound类型的用户Handler(如果有),事件依次传递下去,直到传递到head handler,该handler会调用unsafe.connect向eventloop(nio的selector)注册一个读事件。

二、connect成功之后数据流图(inbound类型事件)

当用户发起一个connect请求后,当连接可用时,eventloop(底层使用nio的selector)会引发一个ChannelActive事件,该事件最先有unsafe捕获,之后会调用pipeline.fireChannelActive将该事件在pipeline中传播,紧接着会根据inbound类型事件的传递方式在各个handler和context之间进行链式传递。其中,有一个比较关注的地方是,在channelActive事件触发的时候,如果channel被设置成autoRead,那么此时还会调用channel.read方法,该方法并不是真正的从channel读取数据,而是向eventloop注册读事件(因为一个channel在向eventloop中注册时,默认不注册任何事件),关于channel.read的过程可以看下文的另一张图。

三、channel.read事件流图(outbound类型事件)

当用户调用channel.read后,会发起一个outbound类型的事件,该事件最先会由pipeline中tail handler处理,该handler只是将该事件透传给前面一个outbound类型的用户handler(如果有的话),这样依次继续向前传递,直到传递到head handler,该handler会调用unsafe.read向eventloop注册读事件(也就是向nio的selector上添加读事件)

四、channel.write(outbound类型事件)

与channel.read类型,wirte也是一个outbound类型事件,该事件最先会由pipeline中的tail handler透传给前面的一个outbound类型的用户handler(如果有的话),这样依次传递,直到传递给head handler,该handler会调用unsafe.write方法,这里的wirte并不会执行真正的发送,而是将要发送的数据缓存起来,直到调用flush时,这些数据才会执行真正的网络io。

五、flush(outbound类型事件)

如前文所示,flush也是一个outbound类型的事件,与wirte不同,flush会执行真正的网络io操作。

六、当channel有数据可读时(inbound类型事件)

当eventloop层检测到网络层有数据可读时(nio的selector返回相应的seleciontKeys),该事件会首先传递给unsafe,紧接着会调用pipeline.fireChannelRead,将事件开始在pipeline中传递,该事件最先会有head handler处理(head.fireChannelRead()),该handler直接将事件透传给下一个inbound类型的用户handler(如果有的话),该事件依次向下传递,直到传递到tail handler。

Netty学习总结(4)——图解Netty之Pipeline、channel、Context之间的数据流向相关推荐

  1. Netty学习记录-初步认识Netty及I/O模型

    Netty学习记录 Netty简介 Netty特征 Netty架构结构图 Netty如今使用的场景 IO了解 BIO: BIO演变的NIO的过程 NIO: NIO三大核心(重点) NIO非阻塞网络编程 ...

  2. Netty学习(一)-- Netty 底层 Java NIO

    视频地址,建议观看,老师由浅入深,循序渐进: https://www.bilibili.com/video/BV1py4y1E7oA 前面的学习:https://blog.csdn.net/weixi ...

  3. Netty学习笔记(五) 使用Netty构建静态网页服务器

    昨天在继续完善基于Netty构建的聊天室系统的过程中,发现了一个有意思的知识点,特此拿来做一个简单的静态网页服务器,好好的玩一玩Netty. 但是不管怎么说利用netty实现各种功能的流程都是类似的 ...

  4. 安卓开发学习笔记(1)使用Bundle在Activity之间交换数据(实例:模拟淘宝的填写并显示收货地址的功能)

    运行结果: 代码截图: 不要忘记在manifest->AndroidManifest.XML中添加新的Activity,否则会闪退 MainActivity.java AddressActivi ...

  5. Netty学习笔记 - 1 (带源码分析部分)

    2021年12月 北京 xxd 一.Netty是什么 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用 ...

  6. Netty学习前置知识(一)

    文章目录 前言 Netty 介绍 Netty 使用场景 互联网行业 游戏行业 大数据领域 Java IO模型 IO模型 BIO,NIO,AIO场景分析比较 Java BIO 编程 Java BIO介绍 ...

  7. Netty学习笔记(六)Pipeline的传播机制

    前面简单提到了下Pipeline的传播机制,这里再详细分析下 Pipeline的传播机制中有两个非常重要的属性inbound和outbound(AbstractChannelHandlerContex ...

  8. Netty学习笔记(五)Pipeline

    Pipeline是Netty中的另一核心组件,前面在说过在Channel进行初始化的时候最后创建一系列的重要对象,其中就有Pipeline 我们看下Netty官网对于Pipeline的定义 A lis ...

  9. Netty 学习笔记(已完结)

    Netty 0代码示例 A.经典IO多线程 // 获取到的inputStream是SocketInputStream,这个类不是公开的,继承了FileInputStream, InputStream ...

最新文章

  1. jupyter notebook用法积累(快捷键)
  2. Virtual Earth API 在指定zoomLevel添加自定义图层
  3. 【译】10 years Blockchain. The Race is on: Blockchain vs. Tangle vs. Hashgraph
  4. JVM类加载机制(ClassLoader)源码解析
  5. D语言/dlang 2.085.0 发布,GC、Objective-C 混编增强
  6. 利用jquery的ajax获取后台返回的json数据为空
  7. GitHub 多次宕机的罪魁祸首竟是 MySQL?
  8. _过程_函数_触发器_游标
  9. Django的Modelforms的介绍
  10. BGP的community属性
  11. exchange EWS 开发随笔二
  12. FFT为什么要加窗函数?
  13. 老罗android开发视频教程学习完了
  14. 历届美国梦之队战斗力汇总:梦一无敌 梦十二平淡
  15. MIPS汇编语言指令
  16. 干货|程序员有哪些含金量高的证书可以考?
  17. fastgame文档
  18. 微信小程序转发朋友圈
  19. 分形艺术能让你感受上帝的力量——新锐100设计师风达专访
  20. 爬取猫眼电影评分TOP100

热门文章

  1. linux中启动不了服务,Linux系统xinetd服务启动不了
  2. mysql 5.6.31 配置_MySQL5.6.31 winx64.zip 安装配置教程详解
  3. 如何 方法内指令重排 进制_Java虚拟机jvm学习一:认识jvm的运行机制
  4. rust怎么用items刷东西_rust服主怎么刷东西 | 手游网游页游攻略大全
  5. C语言之一些值得被定义为常用C语言头文件库的漂亮宏定义
  6. python中文件操作的相关函数有哪些_Python常见文件操作的函数示例代码
  7. 多关卡连连看php源码_奇怪的连连看ios版是一款非常好玩的手机消除闯关游戏,奇怪的连连看采用了最经典的三消玩法,游戏中有着非常多的游戏关卡,是一...
  8. 计算机控制与网络,网络与通信技术在计算机控制的作用
  9. php 过滤注释,PHP过滤html注释
  10. JAVA移慎_java里面给对象赋值,慎用赋值符号(=) (转)