Netty Review - 探索Channel和Pipeline的内部机制

文章目录

  • 概念
  • Channel Pipeline实现原理分析
    • 详解 Inbound事件和Outbound事件
    • 演示Code

在这里插入图片描述


概念

在这里插入图片描述

Netty中的ChannelPipeline是其核心概念,它们在构建高性能网络应用程序时起着重要作用。

Channel:
在Netty中,Channel表示一个开放的连接,可以执行读取/写入操作。Channel可以是网络套接字,文件,或者任何可以进行I/O操作的实体。每个Channel都与一个EventLoop相关联,它负责处理所有I/O事件和任务。Channel提供了异步的I/O操作,可以通过注册关注的事件来触发。

Pipeline:
Pipeline是一个处理I/O事件或执行业务逻辑的组件链。它由一系列ChannelHandler组成,每个ChannelHandler都负责处理特定类型的事件。当数据通过Channel时,它会在Pipeline中流动,每个ChannelHandler都有机会处理它。

内部机制:

  1. Channel:

    • Channel内部包含一个Pipeline
    • 当一个Channel被创建时,会创建一个新的Pipeline实例。
    • Channel的生命周期与Pipeline密切相关,一个Channel的事件将在其关联的Pipeline中被处理。
  2. Pipeline:

    • Pipeline是由一系列ChannelHandler按顺序组成的。
    • 数据在Pipeline中流动,每个ChannelHandler按照添加的顺序逐个处理数据。
    • 每个ChannelHandler都可以拦截并处理入站(Inbound)或出站(Outbound)事件,例如数据读取、数据写入等。
  3. 事件传播:

    • 当事件通过Channel时,它将被传播到关联的Pipeline
    • 事件首先通过ChannelPipeline中的第一个ChannelHandler,然后依次传播到链中的下一个ChannelHandler
    • ChannelHandler可以拦截并处理特定类型的事件,也可以将事件传递给下一个ChannelHandler
  4. ChannelHandlerContext:

    • ChannelHandlerContextChannelHandlerPipeline以及Channel之间的桥梁。
    • 每个ChannelHandler都有一个关联的ChannelHandlerContext,它提供了访问PipelineChannel的方法。

Netty中的Channel代表一个开放的连接,而Pipeline是一个处理I/O事件的链。

Channel的生命周期与Pipeline紧密相连,数据通过Pipeline中的ChannelHandler逐个处理。

事件传播通过ChannelHandlerContext实现,使得每个ChannelHandler都可以对事件进行处理或传递给下一个处理器。


Channel概念与java.nio.channel概念一致,用以连接IO设备(socket、文件等)的纽带。

在这里插入图片描述

Netty的Channel可以这么分类

Channel的IO类型主要有两种:

  • 非阻塞IO(NIO)
  • 阻塞IO(OIO);

数据传输类型有两种:

  • 按事件消息传递(Message)
  • 按字节传递(Byte)

适用方类型也有两种:

  • 服务器(ServerSocket)
  • 客户端(Socket)

还有一些根据传输协议而制定的的Channel,如:

  • TCP
  • UDTP
  • SCTP等

在这里插入图片描述

Netty按照类型逐层设计相应的类。最底层的为抽象类AbstractChannel,再以此根据IO类型、数据传输类型、适用方类型实现。类图可以一目了然,如上图


Channel Pipeline实现原理分析

在这里插入图片描述
首先,想象一下Channel就像是通道,它提供了一些操作方法,比如读(read)和写(write)。但它并不是直接执行这些操作,而是通过一个叫做Pipeline的东西来实现的。

现在,Pipeline可以看作是一条连接了很多小工具的长链。每个小工具被称为Handler,它们负责处理网络通信中的不同任务,比如数据的编码、解码和其他处理。

这个链的结构可以看作是一个双向链表,每个节点是一个处理器。内部代码实现的流程是从头(Head)到尾(Tail)的顺序,对于传入数据,或者从尾(Tail)到头(Head)的顺序,对于传出数据。


详解 Inbound事件和Outbound事件

Inbound事件和Outbound事件是两种类型的事件,根据触发事件的源头进行区分

https://stackoverflow.com/questions/22354135/in-netty4-why-read-and-write-both-in-outboundhandler

在这里插入图片描述

Inbound指网络数据从外部进入Netty过程,也就是数据的输入。当Nettyt收到外部的数据,就会调用Inbound相关方法来处理数据。例如,当Netty收到一个新的连接请求时,就会调用Inbound#channelActive方法来处理这个连接请求。另外,当Netty接收到一个数据包时,就会调用Inbound#channelRead方法来处理这个数据包。

outbound指网络数据从Netty出到外部的过程,也就是数据的输出。当Netty 要向外部发送数据时,就会调用Outbound 相关方法来处理数据。例如,当Netty 要向外部发送一个数据包时,就会调用Outbound#write法来将数据包写入输出缓冲区。另外,当Netty需要关闭一个连接时,就会调用outboundc#lose方法来关闭连接。


演示Code

请移步  [Netty Review - 探索Pipeline的Inbound和Outbound](https://blog.csdn.net/yangshangwei/article/details/134704751)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/186758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由于找不到msvcp120.dll的解决方法,msvcp120.dll修复指南

当你尝试运行某些程序或游戏时,可能会遇到系统弹出的错误消息,提示"找不到msvcp120.dll"或"msvcp120.dll丢失"。这种情况通常会妨碍程序的正常启动。为了帮助解决这一问题,本文将深入讨论msvcp120.dll是什么,…

YOLOv8优化策略:检测头结构全新创新篇 | RT-DETR检测头助力,即插即用

🚀🚀🚀本文改进:RT-DETR检测头助力YOLOv8检测,保持v8轻量级的同时提升检测精度 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1.RT-DETR介绍 论文: https://arxiv.org/pdf/2304.08069.pdf 摘要:…

再探Java集合系列—LinkedHashMap

LinkedHashMap 继承了 HashMap 所以LinkedHashMap也是一种k-v的键值对,并且内部是双链表的形式维护了插入的顺序 LinkedHashMap如何保证顺序插入的? 在HashMap中时候说到过HashMap插入无序的 LinkedHashMap使用了双向链表,内部的node节点包含…

CityEngine2023安装与快速入门

目录 0 引言1 安装2 CityEngine官方示例2.1 官方地址2.2 导入示例工程 3 结尾 🙋‍♂️ 作者:海码007📜 专栏:CityEngine专栏💥 标题:CityEngine2023安装与快速入门❣️ 寄语:书到用时方恨少&am…

P1025 [NOIP2001 提高组] 数的划分

暴搜 剪枝 枚举固定的位置 #include<bits/stdc.h> using namespace std; using ll long long; const int N 1e310; int n,k; int res; void dfs(int last,int sum,int cur){if(curk){if(sumn)res;return;}for(int ilast;isum<n;i)dfs(i,sumi,cur1); } int main() {c…

倒计时(JS计时器)

<script>function countDown() {document.body.innerHTML ;//清空页面内容var nowTimer new Date(); //现在时间的毫秒数var valueTimer new Date("2024-1-1 12:00"); //用户输入年份倒计时时间毫秒数var timer (valueTimer - nowTimer) / 1000; //倒计时秒…

有什么值得推荐的node. js练手项目吗?

前言 可以参考一下下面的nodejs相关的项目&#xff0c;希望对你的学习有所帮助&#xff0c;废话少说&#xff0c;让我们直接进入正题 1、 NodeBB Star: 13.3k 一个基于Node.js的现代化社区论坛软件&#xff0c;具有快速、可扩展、易于使用和灵活的特点。它支持多种数据库&…

解决:ValueError: the first two maketrans arguments must have equal length

解决&#xff1a;ValueError: the first two maketrans arguments must have equal length 文章目录 解决&#xff1a;ValueError: the first two maketrans arguments must have equal length背景报错问题报错翻译报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在…

如何在Ubuntu系统上安装Git

简单介绍 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git 与常用的版本控制工具CVS&#xff0c;Subversion 等不同&#xff0c;它采用了分布式版…

四、shell - 字符串

目录 1、单引号 2、双引号 3、拼接字符串 3.1 使用双引号拼接 3.2 使用单引号拼接 4、获取字符串长度 ​​​​​​​5、提取子字符串 ​​​​​​​6、查找子字符串 ​​​​​​​字符串是shell编程中最常用最有用的数据类型&#xff08;除了数字和字符串&#xff0…

Flutter应用程序加固的问题及解决方案

​&#x1f680;Flutter应用程序加固的问题及解决方案引言在移动应用开发中&#xff0c;为了保护应用程序的安全性&#xff0c;开发者需要对应用进行加固。在使用Flutter技术进行应用程序开发时&#xff0c;也需要注意应用程序的安全问题和加固方案。本文将介绍在Flutter应用程…

科普:什么是合同生命周期管理?

在当前&#xff0c;企业面临自身转型升级与行业数字建设的挑战&#xff0c;急需一种系统化的解决方案&#xff0c;帮助企业在自身运作方面实现降本增效&#xff0c;为拓展业务获得发展提供助力&#xff0c;而合同生命周期管理在其中就扮演着十分重要的角色。 一、合同生命周期…

[安洵杯 2019]easy_web

打开环境 img传参还有cmd img应该是base&#xff0c;先解码看看 3535352e706e67 这个好像是十六进制的&#xff0c;再解 访问一下看看&#xff0c;得到一张图片 尝试base解码&#xff0c;但是没有什么发现 再看看地址栏出现index.php,应该是要下载源码&#xff0c;但是还没有…

【紫光同创PCIE教程】——使用官方驱动在Windows下进行DMA读写操作/PIO读写操作

本原创教程由深圳市小眼睛科技有限公司创作&#xff0c;版权归本公司所有&#xff0c;如需转载&#xff0c;需授权并注明出处&#xff08;www.meyesemi.com) 紫光同创官方主推的是在linux系统下开发驱动和上层软件&#xff0c;相应地&#xff0c;官方提供了在linux一个基于GTK2…

hadoop安装

简介 Hadoop是一个开源的分布式存储和计算框架&#xff0c;最初由Apache软件基金会开发。它的发展背景可以追溯到Google的MapReduce和Google File System&#xff08;GFS&#xff09;的论文&#xff0c;这两篇论文启发了Hadoop的设计。Hadoop的主要应用场景包括大数据存…

行业追踪,2023-11-30

自动复盘 2023-11-30 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

h5小游戏--2048

2048 经典2048小游戏&#xff0c;基于JS、Html5改写版 效果预览 点我下载源代码 下载代码解压后&#xff0c;双击index.html即可开始本游戏。 Game Rule 游戏规则 以下为游戏默认规则&#xff0c;若需要修改规则请修改代码。 移动箭头键来移动方块&#xff0c;当两个相同数…

flutter开发实战-readmore长文本展开和收缩控件

flutter开发实战-readmore长文本展开和收缩控件 当长文本展开和收缩控件&#xff0c;我们需要使用readmore来处理长文本展开和收缩&#xff0c;方便阅读 一、引入readmore 在工程的pubspec.yaml中引入插件 readmore: ^2.1.0ReadMoreText的属性如下 const ReadMoreText(this.…

Andrioid T 实现充电动画(2)

Andrioid T 实现充电动画&#xff08;2&#xff09; 以MTK平台为例&#xff0c;实现充电动画 效果图 资源包 修改文件清单 system/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/prize_charge_layout.xmlsystem/vendor/mediatek/proprietary/packages/ap…

Bilateral Guided Upsampling

Abstract 我们提出了一种加速一大类图像处理算子的算法。给定低分辨率参考输入和输出对&#xff0c;我们通过拟合将输入映射到输出的局部曲线来对算子进行建模。然后&#xff0c;我们可以通过在全分辨率输入上评估这些低分辨率曲线来生成全分辨率输出。我们证明&#xff0c;这…