当前位置: 首页 > news >正文

Netty—ChannelHandler

文章目录

  • 一、Channel、ChannelPipeline 以及ChannelHandler 三者的关系❓
  • 二、ChannelHandler 是什么?🤔️
  • 三、ChannelInboundHandler
  • 四、ChannelOutboundHandler

一、Channel、ChannelPipeline 以及ChannelHandler 三者的关系❓

通过以上对Channel和ChannelPipeline的源码解读,想必大家已知晓Channel、ChannelPipeline和 ChannelHandler 三者的关系,正如图所示:
在这里插入图片描述

  • 每一个 Channel 中都会包含一个 ChannelPipeline 属性
  • ChannelPipeline 是一个双向链表结构,默认会包含 HeadContext 和 TailContext 两个节点
  • 当向 ChannelPipeline 中添加 ChannelHandler 时,会包装成 ChannelContext 插入到 ChannelPipeline 链表中
  • 当 Channel 中发生指定事件时,该事件就会在 ChannelPipeline 中沿着双向链表进行传播,调用各个 ChannelHandler 中的指定方法,完成相应的业务处理

Netty 正是通过 ChannelPipeline 这一结构为用户提供了自定义业务逻辑的扩展点,用户只需要向 ChannelPipeline 中添加处理对应业务逻辑的 ChannelHandler,之后当指定事件发生时,该 ChannelHandler 中的对应方法就会进行回调,实现业务的处理。

打个比喻,每个 channel 是一个产品的加工车间,pipeline 是车间中的流水线,channelHandler 就是流水线上的各道工序,byteBuf 是原材料,经过很多工序的加工:先经过一道道入站工序,再经过一道道出站工序最终变成产品。

二、ChannelHandler 是什么?🤔️

ChannelHandler 基于责任链模式实现,负责对IO事件进行拦截和处理, 也可以终止事件的传递。ChannelHandler 有两个重要的子接口ChannelInboundHandlerChannelOutboundHandler,分别拦截入站和出站的各种 I/O 事件

  • 入站处理器通常是 ChannelInboundHandlerAdapter 的子类,主要用来 处理入站数据以及各种变化,简单理解就是:客户端或者服务器端接收其他端的数据进行处理;
  • 出站处理器通常是 ChannelOutboundHandlerAdapter 的子类,主要用来 处理 出站 数据并且允许拦截所有的操作,简单理解就是:客户端或者服务器端发送数据给其他端的数据处理,同时还可以拦截读写操作。

在这里插入图片描述
ChannelHandler支持注解,Netty提供了2个:

  • Sharable:多个ChannelPipline公用同一个ChannelHandler
  • Skip:被Skip注解的方法不会被调用

ChannelDuplexHandler是双工处理器,具有ChannelInboundHandler和ChannelOutboundHandler的功能

三、ChannelInboundHandler

ChannelInboundHandler 处理入站数据以及各种状态变化,当 channel 状态发生改变会调用 ChannelInboundHandler 中的一些生命周期方法,以下罗列ChannelInboundHandler的事件回调方法与触发时机!

  1. channelRegistered 注册事件。channel 被注册到 EventLoop 上后调用,例如服务岗启动时,pipeline.fireChannelRegistered()
  2. channelUnregistered 注销事件。channel 从 EventLoop 上注销后调用,例如关闭连接成功后,pipeline.fireChannelUnregistered()
  3. channelActive 激活事件,绑定端口成功后调用,pipeline.fireChannelActive()
  4. channelInactive 非激活事件,连接关闭后调用,pipeline.fireChannelInactive()
  5. channelRead 读事件,channel有数据时调用,pipeline.fireChannelRead()
  6. channelReadComplete 读完事件,channel读完之后调用,pipeline.fireChannelReadComplete()
  7. channelWritabilityChanged 可写状态变更事件,当一个channel的可写的状态发生改变的时候执行,可以保证写的操作不要太快,防止OOMpipeline.fireChannelWritabilityChanged()
  8. userEventTriggered 用户事件触发,例如心跳检测,ctx.fireUserEventTriggered(evt)
  9. exceptionCaught 异常事件

我们可以看出,Inbound事件都是由I/O线程触发,用户实现部分关注的事件被动调用

ChannelInboundHandlerAdapter作为ChannelInboundHandler的实现,默认将入站事件自动传播到下一个入站处理器。其中的代码高度一致,如channelRead()
在这里插入图片描述
查找通道中的下一个Inbound

private AbstractChannelHandlerContext findContextInbound(int mask) {AbstractChannelHandlerContext ctx = this;do {ctx = ctx.next;} while ((ctx.executionMask & mask) == 0);return ctx;
}

四、ChannelOutboundHandler

ChannelOutboundHandler 的事件回调方法与触发时机!此外 ChannelOutboundHandler 中绝大部分接口都包含ChannelPromise 参数,以便于在操作完成时能够及时获得通知。

  1. bind 事件,绑定端口
  2. close事件,关闭channel
  3. connect事件,用于客户端,连接一个远程机器
  4. disconnect事件,用于客户端,关闭远程连接
  5. deregister事件,用于客户端,在执行断开连接disconnect操作后调用,将channelEventLoop中注销
  6. read事件,用于新接入连接时,注册成功多路复用器上后,修改监听为OP_READ操作位
  7. write事件,向通道写数据
  8. flush事件,将通道排队的数据刷新到远程机器上

同理,ChannelOutboundHandlerAdapter作为ChannelOutboundHandler的事件,默认将出站事件传播到下一个出站处理器~

相关文章:

Netty—ChannelHandler

文章目录 一、Channel、ChannelPipeline 以及ChannelHandler 三者的关系❓二、ChannelHandler 是什么?🤔️三、ChannelInboundHandler四、ChannelOutboundHandler 一、Channel、ChannelPipeline 以及ChannelHandler 三者的关系❓ 通过以上对Channel和Ch…...

Android 集成onenet物联网平台

一,在Android应用程序中集成OneNet物联网平台,您可以按照以下步骤进行操作: 注册OneNet账户:首先,您需要在OneNet官方网站上注册一个账户。访问OneNet网站(https://open.iot.10086.cn/ ↗)&…...

java八股文面试[JVM]——如何打破双亲委派模型

双亲委派模型的第一次“被破坏”是重写自定义加载器的loadClass(),jdk不推荐。一般都只是重写findClass(),这样可以保持双亲委派机制.而loadClass方法加载规则由自己定义,就可以随心所欲的加载类,典型的打破双亲委派模型的框架和中间件有tomc…...

一加11/Ace2/10Pro手机如何实现全局120HZ高刷-游戏超级流畅效果

已经成功root啦。安卓13目前也一样支持LSPosed框架,如果你对LSP框架有需求,也可以使 自测120HZ刷新率诞生以后,很多小伙伴用上了就很难回来啦,一加11/Ace2/10Pro/9pro手 机厂商也对新机做了很多的适配,让我们日常使用起…...

微服务主流框架概览

微服务主流框架概览 目录概述需求: 设计思路实现思路分析1.HSF2.Dubbo 3.Spring Cloud5.gRPC Service mesh 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a be…...

Python Flask Web开发二:数据库创建和使用

前言 数据库在 Web 开发中起着至关重要的作用。它不仅提供了数据的持久化存储和管理功能,还支持数据的关联和连接,保证数据的一致性和安全性。通过合理地设计和使用数据库,开发人员可以构建强大、可靠的 Web 应用程序,满足用户的…...

快速学会git版本管理——上传gitee仓库

首先在gitee右上角有一个新建仓库 创建之后打开自己想要上传的文件 右键打开 Git Bash Here 接下来会弹出git的窗口 首先先初始化仓库 用git命令 git init 然后用git add . 上传所有文件上传到暂存区(上一篇文章说过add是单个文件,add . 是所有文件) 没有显示错误 …...

应用在智能洗衣机触摸屏上的电容式触摸芯片

智能型全自动洗衣机可以自动判断水温、水位、衣质衣量、衣物的脏污情况,决定投放适量的洗涤剂和的洗涤程序。当洗衣桶内衣物的多少和质地不同,而注入水使其达到相同的水位时,其总重量是不同的。利用这一点,通过对洗衣电动机低速转…...

npm版本升级报错

解决方法: 执行npm install --legacy-peer-deps依赖对等 npm install xxx --legacy-peer-deps命令用于绕过peerDependency里依赖的自动安装;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但版本不同的问题,以npm v4-v6的方式去继续执行…...

Vue+Element-ui+SpringBoot搭建后端汽车租赁管理系统

最近在做项目,花了一周的时间搭建了一个十分完备的汽车租赁后端管理系统。页面采用纯Vue2Element-ui搭建,后端采用SpringbootMybatis搭建,数据库采用Mysql。包括了登录验证,根据不同权限进入不同界面、数据增删改查、表格分页、表…...

PKU校园网连接失败

校园网连接失败 连上校园网,显示已经连接但是没有网络,手动输入校园网门户( its.pku.edu.cn )也没有用。 使用 windows自带的疑难解答,分析发现dns解析异常。 解决方案 手动配置IPV4的dns。 同学的电脑可以正常连接dns,将同学…...

STM32存储左右互搏 I2C总线读写FRAM MB85RC16

STM32存储左右互搏 I2C总线读写FRAM MB85RC16 在较低容量存储领域,除了EEPROM的使用,还有铁电存储器FRAM的使用,相对于EEPROM, 同样是非易失性存储单元,FRAM支持更高的访问速度, 其主要优点为没有EEPROM持续写操作跨页…...

【typeof instanceof Object.prototype.toString constructor区别】

几个数据类型判断区别 typeofinstanceofObject.prototype.toStringconstructor typeof 它返回的是一个字符串,表示未经过计算的操作数的类型 typeof(undefined) //"undefined"typeof(null) //"object"typeof(100) //"number"typeof…...

ARM Codec要求

文章目录 前言一、驱动1. linux kernel driver (非V4L2驱动)1.1 porting guide1.2 programing guide1.3 CPU占用率统计1.4 memory使用统计(不包含input/output/working buffer) 2. freeRTOS driver2.1 porting guide,驱动所支持freeRTOS版本列表2.2 programing guid…...

QT多线程

1.QT4.7以前的版本-----线程处理方式 1. 出现的警告 直接使用从UI—>转到槽,就会出现警告 2. 出现的错误 error: invalid operands of types QTimer* and void (QTimer::*)(QTimer::QPrivateSignal) to binary operator& 错误:无效的操作数类型’QTimer…...

【linux命令讲解大全】059.命令行利器:快速执行指定命令的command命令

文章目录 command补充说明语法参数实例 从零学 python command 调用并执行指定的命令。 补充说明 command 命令用于调用指定的命令并执行,命令执行时不查询 shell 函数。command 命令只能执行 shell 内部的命令。 语法 command [参数]参数 指令:需…...

opencv-4.5.2-android-sdk.zip安装教程

opencv-4.5.2-android-sdk.zip: 下载链接:百度网盘 请输入提取码 提取码:s0p2 导入模块的方法: ①、导入模块 ②、定位到sdk目录 点击ok就行,就导入成功了。导入成功后会多出一个可展开的opencv文件夹(自己命名的),一定要能展…...

接口自动化测试系列-excel管理测试用例

代码源码: 框架结构 核心代码 excel数据处理 from configureUtil.LogUtil import getlog logger getlog(targetNameHandleData) import xlrd from openpyxl import load_workbook,workbook from openpyxl.styles import Font, colors import openpyxl import o…...

Spring——Spring的控制反转IOC

摘要 IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;…...

基于CentOS7.5构建LVS-DR 群集,并启用Nginx负载均衡,一键完成。

在两台服务器上的步骤: 安装必要软件:在两台服务器上,安装必要的软件,包括ipvsadm和keepalived。使用以下命令安装软件: sudo yum install ipvsadm keepalived -y 禁用防火墙或配置规则:禁用防火墙或根据实…...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

在Ubuntu24上采用Wine打开SourceInsight

1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

Ubuntu Cursor升级成v1.0

0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...