图解Netty之Pipeline、channel、Context之间的数据流向。

2023-10-29

   以下所绘制图形均基于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。

 

 




https://www.cnblogs.com/chenyangyao/p/netty.html?utm_source=itdadao&utm_medium=referral

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图解Netty之Pipeline、channel、Context之间的数据流向。 的相关文章

  • 为什么 UDP 服务器中只有一个套接字?

    我正在准备考试 发现了这个问题 典型的 UDP 服务器可以使用单个套接字来实现 解释一下为什么 对于 TCP 驱动的服务器 我发现创建了两个套接字 一个用于所有客户端访问服务器 另一个用于每个客户端的特定 套接字 用于服务器和客户端之间的进
  • iOS 上的多个 HTTP 请求与单个 TCP 连接

    我正在开发一个 iPhone 应用程序 它使用我控制的基于 Web 的 API 连接到持续打开的 TCP 端口并通过 TCP API 发出请求 或者为我想要获取的所有数据发出新的 HTTP 请求 会更快或更高效吗 我认为差异可以忽略不计 但
  • 分配 TCP/IP 端口供内部应用程序使用

    我编写了一个由 Windows 服务托管的 WCF 服务 它需要侦听已知的 TCP IP 端口 我可以在什么范围内安全地分配端口供我的组织内使用 该端口将嵌入到服务和使用该服务的客户端的配置文件中 端口 0 1023 是众所周知的端口 由
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • Netty通道读取混乱

    我三个月前开始使用 Netty 最初 它看起来非常简单且易于使用 因为我遵循了 4 x 系列主页中给出的示例 当我更深入地探索它时 我无法理解某些事件或回调名称 例如 我无法理解以下内容之间的区别 ChannelRead ChannelHa
  • 建立 TCP 连接边界的正确方法

    我的问题是关于如何正确处理使用 tcp 连接接收的数据 事实上 通过建立 tcp 连接 创建了一个流 假设我想发送一条有开头和结尾的消息 由于数据在流中流动而没有指定任何边界 我如何识别消息的开始和结束 我想在消息的开头和结尾处放置一些特殊
  • 如何知道哪个本地应用程序连接到我的套接字(Windows)

    我有一个绑定到某个 TCP 端口的 Windows 服务 该端口用于我的应用程序之间的 IPC 有没有一种编程 WinAPI WinSocket 等 方法可以知道哪个应用程序连接到我的端口 即在我的 Windows 服务中 我想获取连接到我
  • 套接字编程-listen() 和accept() 有什么区别?

    我一直在读本教程 http www cs rpi edu moorthy Courses os98 Pgms socket html了解套接字编程 看来listen and accept 系统调用都做同样的事情 即阻塞并等待客户端连接到使用
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • TCP打孔问题

    我尝试使用 Python 3 中概述的原则为防火墙编写一个基本的 TCP 打孔器本文 http www bford info pub net p2pnat index html 不过 我无法连接任何东西 这是代码 usr bin pytho
  • 无法从亚马逊Windows实例的公共IP访问node.js服务器

    我正在 Windows 服务器的亚马逊微实例上运行 Node js 服务器 我无法使用亚马逊实例的公共IP访问node js服务器 我可以使用 localhost 12345 从实例访问 node js 服务器 但无法使用实例的公共 IP
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • Java TCP Echo 服务器 - 广播

    我有一个简单的回显服务器 我希望当连接的用户向服务器键入任何内容时 所有其他客户端和该客户端都会收到消息 MOD 它现在不会发送给所有客户端 但它应该发送 而且我只是不知道我的代码出了什么问题 所以现在它只会将消息 MOD 发送给发送消息的
  • 如何使用C从http下载文件?

    最近几天我试图弄清楚如何从 URL 下载文件 这是我对套接字的第一个挑战 我用它来了解协议 所以我想在没有 cURL 库的情况下只用 C 语言来完成它 我搜索了很多 现在我可以打印页面的源代码 但我认为这与文件不同 我不必只将接收到的数据从
  • 服务器套接字在 Close_Wait 中挂起

    场景如下 我正在从 C 服务器应用程序向客户端发送大量数据 突然数据流停止 客户端没有数据更新并且端口被阻塞 发生这种情况时 服务器端症状是 Close Wait 在该端口 netstat 操作将在日志中阻塞 错误代码 135 无法从客户端
  • python 中的原始套接字和 sendto

    我正在努力将 scapy 与twisted 集成 但我在 OSX 上遇到了这个非常奇怪的错误 我似乎无法弄清楚 基本上我无法通过原始套接字发送有效的 TCP 数据包 包括 IP 标头 这就是我正在做的 import socket from
  • C# P2P聊天应用程序设计

    我想创建一个不使用显式服务器的简单聊天应用程序 主要要求是用户可以同时与许多朋友聊天 就像在 Skype 等上一样 我在这里指的不是会议聊天 而是多个单独的聊天窗口 目前 我只想要一个 LAN 消息应用程序 但如果设计能够轻松扩展到 Int
  • 伪TCP通道

    什么是伪 TCP 通道以及如何实现 伪 TCP 是一种协议 它实现了 TCP 的一些思想 通过不可靠的基于数据包的接口提供可靠的数据流 例如 如果您只能访问 UDP 但想要 一种可靠的方式来传递数据 则可以使用此方法 您可以在这里找到示例代
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • 如何用单线程实现TCP上的全双工通道?

    我正在编写的网络库需要通过 TCP 套接字发送和接收消息 消息可以随时发送或接收 即应该作为全双工通道工作 我能够使用两个线程来实现这样的场景 调用 send 的主线程和一个主要在 receive 调用处阻塞的专用线程 我的问题是 是否可以

随机推荐

  • 浅谈对集群、分布式、分布式集群、微服务的理解

    我认为集群是个物理形态 分布式是个工作方式 分布式其实也是物理形态 这里相比较而言的 当集群中的服务器都做同样的事情时 集群就是一个集群 当集群中的服务器各司其职时 他就变成了分布式 所以说分布式中的每一个节点都可以是集群 但是集群并不一定
  • ES6的迭代器与迭代协议Symbol.iterator

    前言 ES6新增了两个协议 可迭代协议 对象必须具有Symbol Iterator属性 属性值为一个函数 当这个对象被迭代时 就会调用该函数 返回一个迭代器 迭代器协议 描述了迭代器对象的具体规则 迭代器 迭代器 它是用于访问集合类的标准访
  • 如何解决pip更新问题.WARNING: You are using pip version 19.2.3, however version 19.3.1 is available.

    出现如图所示 当直接输入python m pip install upgrade pip更新还报错的时候 输入命令 python m pip install pip 结果如图所示 亲测有效
  • mysql注解参数_MySQL主从复制参数注解

    MySQL主从复制参数注解 master所有参数 1 log bin mysql bin 1 控制master的是否开启binlog记录功能 2 二进制文件最好放在单独的目录下 这不但方便优化 更方便维护 3 重新命名二进制日志很简单 只需
  • String的intern()方法浅析

    简介 String intern 方法是一种手动将字符串加入常量池中的native方法 原理如下 如果在当前类的常量池中存在与调用intern 方法的字符串等值的字符串 就直接返回常量池中相应字符串的引用 否则在常量池中复制一份该字符串 J
  • 连续不等_从“Jensen不等式”导出几个著名不等式

    常用的著名不等式 从Jensen不等式出发导出其他一些知名不等式 加权AG不等式 对 有 证明 记 因为对数函数为凸函数 使用加权琴生不等式 可得 Young不等式 若 则 证明 利用上述 加权AG不等式有 记 带入整理可得Young不等式
  • 2.2设备树的规范(dts和dtb)——DTB格式

    本节讲述设备树的dtb格式 上节讲述了dts格式 回顾上节 在dts文件和dtsi文件中 可以使用C语言的define和include 使用方法和作用也同C语言相同 编写dts文件后 需要使用dtc工具将dts文件编译成dtb文件 dtc工
  • Linux应用开发程序测试

    文章目录 前言 一 通过SDK开发应用程序 创建工程 将该工程的 elf 文件运行在我们搭建的Linux上 3 SDK调试 小总结 1 打开SDK 创建Linux应用程序工程 2 编写代码 3 编译代码 4 将可执行文件拷贝到开发板根文件系
  • Python,OpenCV应用轮廓逼近算法,检测对象的形状

    上一篇博客 我们学习了如何利用Python OpenCV计算轮廓的中心 这一节学习仅运用轮廓的基本属性来检测其形状 三角形 正方形 矩形 五边形 圆 1 利用轮廓逼近 将曲线上的点数减少为更简单的近似版本的过程 2 基于该轮廓逼近 检查每种
  • 自学网络安全,学习路线图必不可少,【282G】初级网络安全学习资源分享!

    前言 在自学网络安全的时候 我们总会遇到一些问题 我们可以在网上看到很多关于前端的这些问题 你们都是怎么学网络安全web前端的 零基础 怎么自学好网络安全 网络安全需要学多久 都学哪些知识 想成为一名合格的网络安全工程师 需要掌握哪些技能
  • SpringBoot第 6 讲:SpringBoot+jersey跨域文件上传

    一 创建Maven项目 参考 SpringBoot第 1 讲 HelloWorld 秦毅翔的专栏 CSDN博客 二 修改pom xm
  • 爬虫保存cookies时重要的两个参数(ignore_discard和ignore_expires)的作用

    代码如下 由于临时做的实例采用登录云打码平台的cookies import requests from lxml html import etree from fake useragent import UserAgent from htt
  • golang rpcx记录一次解决 context deadline exceeded的问题

    测试同时并发一万个应用去调用另一个微服务应用结果出现了上下文切换超时的问题 默认的超时时间只有一秒时间 程序在高并发的场景下很容易触发这个错误 最简单的解决办法就是把超时时间调大一点 以前设置的是一秒 现在调成五秒 另一种解决办法就是优化自
  • FHD、4K、8K为何物

    转自 http www 4k123 com thread 145 1 1 html 近段时间 分辨率是一个很热的话题 4K与8K两个词频繁曝光于各大行业网站 8月23日 联合国旗下的国际电讯联盟通过以日本NHK电视台所建议的7680x432
  • Springboot2.0快速入门(第一章)

    目录 一 SpringBoot简介 1 1 回顾什么是Spring 1 2 Spring是如何简化Java开发的 1 3 什么是SpringBoot 二 Hello World 2 1 准备工作 2 2 创建基础项目说明 2 3 创建第一个
  • CoreML模型分析

    准备工作 首先得有一个Xcode以及一个简单的添加了CoreMLFramework的工程 下载模型 如官方推荐的MobileNetV2 将模型导入到工程中 并添加到你的编译项目中 双击打开 会看到这么一个页面 5 然后点击 就可以进入到模型
  • rust核心语法

    一 强类型语言 自动判断定义的变量类型 let a 323 不可变整形变量 let mut a 323 可变整形变量 变量声明方式 let a u64 323 不声明会被默认 二 表达式 1 可以在一个用 包括的块里编写一个较为复杂的表达式
  • react-container-query

    1 媒体查询 响应式组件 2 使用方法 1 引入 import ContainerQuery from react container query 2 规定屏幕尺寸 媒体查询 const query screen xs maxWidth 5
  • mysql强制指定查询使用的索引

    语法 select from table name force index index name where conditions 例如 mysql强制使用指定索引查询 SELECT FROM yrd pay flow FORCE INDE
  • 图解Netty之Pipeline、channel、Context之间的数据流向。

    以下所绘制图形均基于Netty4 0 28版本 一 connect outbound类型事件 当用户调用channel的connect时 会发起一个outbound类型的事件 该事件将在pipeline中传递 pipeline connec