Netty学习总结(4)——图解Netty之Pipeline、channel、Context之间的数据流向
以下所绘制图形均基于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之间的数据流向相关推荐
- Netty学习记录-初步认识Netty及I/O模型
Netty学习记录 Netty简介 Netty特征 Netty架构结构图 Netty如今使用的场景 IO了解 BIO: BIO演变的NIO的过程 NIO: NIO三大核心(重点) NIO非阻塞网络编程 ...
- Netty学习(一)-- Netty 底层 Java NIO
视频地址,建议观看,老师由浅入深,循序渐进: https://www.bilibili.com/video/BV1py4y1E7oA 前面的学习:https://blog.csdn.net/weixi ...
- Netty学习笔记(五) 使用Netty构建静态网页服务器
昨天在继续完善基于Netty构建的聊天室系统的过程中,发现了一个有意思的知识点,特此拿来做一个简单的静态网页服务器,好好的玩一玩Netty. 但是不管怎么说利用netty实现各种功能的流程都是类似的 ...
- 安卓开发学习笔记(1)使用Bundle在Activity之间交换数据(实例:模拟淘宝的填写并显示收货地址的功能)
运行结果: 代码截图: 不要忘记在manifest->AndroidManifest.XML中添加新的Activity,否则会闪退 MainActivity.java AddressActivi ...
- Netty学习笔记 - 1 (带源码分析部分)
2021年12月 北京 xxd 一.Netty是什么 Netty 是由 JBOSS 提供的一个 Java 开源框架,现为 Github 上的独立项目. Netty 是一个异步的.基于事件驱动的网络应用 ...
- Netty学习前置知识(一)
文章目录 前言 Netty 介绍 Netty 使用场景 互联网行业 游戏行业 大数据领域 Java IO模型 IO模型 BIO,NIO,AIO场景分析比较 Java BIO 编程 Java BIO介绍 ...
- Netty学习笔记(六)Pipeline的传播机制
前面简单提到了下Pipeline的传播机制,这里再详细分析下 Pipeline的传播机制中有两个非常重要的属性inbound和outbound(AbstractChannelHandlerContex ...
- Netty学习笔记(五)Pipeline
Pipeline是Netty中的另一核心组件,前面在说过在Channel进行初始化的时候最后创建一系列的重要对象,其中就有Pipeline 我们看下Netty官网对于Pipeline的定义 A lis ...
- Netty 学习笔记(已完结)
Netty 0代码示例 A.经典IO多线程 // 获取到的inputStream是SocketInputStream,这个类不是公开的,继承了FileInputStream, InputStream ...
最新文章
- jupyter notebook用法积累(快捷键)
- Virtual Earth API 在指定zoomLevel添加自定义图层
- 【译】10 years Blockchain. The Race is on: Blockchain vs. Tangle vs. Hashgraph
- JVM类加载机制(ClassLoader)源码解析
- D语言/dlang 2.085.0 发布,GC、Objective-C 混编增强
- 利用jquery的ajax获取后台返回的json数据为空
- GitHub 多次宕机的罪魁祸首竟是 MySQL?
- _过程_函数_触发器_游标
- Django的Modelforms的介绍
- BGP的community属性
- exchange EWS 开发随笔二
- FFT为什么要加窗函数?
- 老罗android开发视频教程学习完了
- 历届美国梦之队战斗力汇总:梦一无敌 梦十二平淡
- MIPS汇编语言指令
- 干货|程序员有哪些含金量高的证书可以考?
- fastgame文档
- 微信小程序转发朋友圈
- 分形艺术能让你感受上帝的力量——新锐100设计师风达专访
- 爬取猫眼电影评分TOP100
热门文章
- linux中启动不了服务,Linux系统xinetd服务启动不了
- mysql 5.6.31 配置_MySQL5.6.31 winx64.zip 安装配置教程详解
- 如何 方法内指令重排 进制_Java虚拟机jvm学习一:认识jvm的运行机制
- rust怎么用items刷东西_rust服主怎么刷东西 | 手游网游页游攻略大全
- C语言之一些值得被定义为常用C语言头文件库的漂亮宏定义
- python中文件操作的相关函数有哪些_Python常见文件操作的函数示例代码
- 多关卡连连看php源码_奇怪的连连看ios版是一款非常好玩的手机消除闯关游戏,奇怪的连连看采用了最经典的三消玩法,游戏中有着非常多的游戏关卡,是一...
- 计算机控制与网络,网络与通信技术在计算机控制的作用
- php 过滤注释,PHP过滤html注释
- JAVA移慎_java里面给对象赋值,慎用赋值符号(=) (转)