【图解IO与Netty系列】Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制

news2024/11/23 20:58:32

Netty编解码器、TCP粘包拆包问题处理、Netty心跳检测机制

  • Netty编解码器
    • 编码器
    • 解码器
    • 编解码器
    • Netty提供的现成编解码器
  • TCP粘包拆包问题处理
  • Netty心跳检测机制

Netty编解码器

网络传输是以字节流的形式传输的,而我们的应用程序一般不会直接对字节流进行处理,而是把字节流解析成有一定结构的数据格式再去处理。因此我们在发送数据时,要对我们的数据进行编码,把它转换成二进制字节流的形式,然后在网络中进行传输,当我们接收到对方传输过来的二进制字节流时,又需要对其进行解码,解析成应用程序能够处理的数据格式。

比如客户端向服务端发送数据的场景:
在这里插入图片描述

这个编码和解码的动作,可以由用户自己去实现,比如我们使用Java原生的NIO进行开发时,就不得不自己去实现一套编解码的逻辑。而我们使用了Netty之后,Netty给我们封装好了各种编解码器,我们只要使用对应的编解码器,即可以很简单的对数据进行编解码,进一步简化了网络程序的开发。

在这里插入图片描述

编码器

Netty提供了两个编码器抽象类,我们可以选择性的继承它们以实现自己定制的编码器,这两个编码器抽象类分别是MessageToByteEncoder和MessageToMessageEncoder。

  • MessageToByteEncoder<I>:将消息编码为字节
  • MessageToMessageEncoder<T>:将消息编码为消息

它们都继承了ChannelOutboundHandlerAdapter,因此它们都是用于处理出站事件的。

在这里插入图片描述

MessageToByteEncoder的抽象方法encode(ChannelHandlerContext ctx, I msg, ByteBuf out)把特定的类型的消息msg编码成二进制,消息类型由泛型“I”指定。我们继承MessageToByteEncoder后,要实现这个encode方法,encode方法接收指定类型的消息对象msg,然后我们对其进行编码后要放入到ByteBuf类型的out对象中。

在这里插入图片描述

MessageToMessageEncoder的抽象方法encode(ChannelHandlerContext ctx, I msg, ByteBuf out)把特定的类型的消息msg编码成另外一种消息,消息类型由泛型“I”指定。我们继承MessageToMessageEncoder后,要实现这个encode方法,encode方法接收指定类型的消息对象msg,然后我们对其进行编码后要放入到List类型的out对象中。

在这里插入图片描述

比如我们可以通过MessageToMessageEncoder把一个对象转换成json格式的字符串,然后通过MessageToByteEncoder把json字符串加密后编码成二进制字节流。

在这里插入图片描述

解码器

Netty提供了两个解码器抽象类,我们可以选择性的继承它们以实现自己定制的解码器,这两个解码器抽象类分别是ByteToMessageDecoder和MessageToMessageDecoder<I>。

  • ByteToMessageDecoder:将字节解码为消息
  • MessageToMessageDecoder<I>:将一种消息类型解码为另一种

它们都继承了ChannelInboundHandlerAdapter,因此它们都是用来处理入站事件的。

在这里插入图片描述

ByteToMessageDecoder的抽象decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)方法中ByteBuf类型参数in可以获取到接收进来的字节流,我们需要把它解码成特定的对象,然后放入List类型的out中。

在这里插入图片描述

MessageToMessageDecoder中的抽象方法decode(ChannelHandlerContext ctx, I msg, List<Object> out)把特定类型的对象msg解码成另一种类型的对象,然后放入out中。

在这里插入图片描述

比如我们接收到上面这个例子发送的编码后的二进制字节流,我们可以通过ByteToMessageDecoder解码后解密成json字符串,然后通过MessageToMessageDecoder把json字符串转成对象。

在这里插入图片描述

编解码器

Netty还提供了集编码解码一体的编解码器抽象类,它们分别是ByteToMessageCodec和MessageToMessageCodec,它们同时处理入站事件和出站事件。但是我们一般很少使用,更多的是把编码和解码分开两个类,这样才能最大化代码的可重用性和可扩展性。

Netty提供的现成编解码器

上面这些都是抽象类,是需要我们自己继承后实现编解码逻辑的,而Netty还有更牛逼的直接现成的编解码器类提供给我们,我们把它们组装到ChannelPipeline中即可使用。

在这里插入图片描述

根据不同的协议或不同的功能,Netty提供了对应的编码器或解码器,有处理SSL或TLS协议的、有处理HTTP协议的、有做HTTP压缩的、有处理WebSocket协议的等等。这里就不一一细说了,我们只要知道Netty都提供了哪些功能的内置编解码器,再按需的去了解即可。

TCP粘包拆包问题处理

由于TCP是一个面向二进制流的协议,是传输层协议,并不理解应用层传下来的业务数据,但是TCP又会根据MSS对数据进行分包处理,于是会出现下面四种情况:

在这里插入图片描述

  • 第一种情况是TCP分包分的刚刚好,D1和D2两个独立的数据包分开发送,这是没有问题的。
  • 第二种情况就是TCP把D1和D2两个数据包连在一起被TCP一同发送,此时就发生了粘包问题。
  • 第三种情况和第四种情况都是其中一个数据包被分成了两半,与另一个数据包一起一同发送,此时就发生了拆包问题。

当发生TCP粘包拆包问题时,接收数据的一方需要通过某种机制将被拆分或粘连的数据包还原成独立的数据包。

Netty提供了多个解码器可以处理TCP粘包拆包问题:

  • LineBasedFrameDecoder:利用回车换行符做分包处理
  • DelimiterBasedFrameDecoder:利用指定的特殊分隔符做分包处理
  • FixedLengthFrameDecoder:以固定长度来分包
  • LengthFieldBasedFrameDecoder:消息头中记录消息总长度,通过消息头中记录的消息体长度进行分包

这几个都是上面说过的Netty提供的现成解码器。

除此以外我们还可以自己实现TCP粘包拆包的处理:

  1. 我们可以通过实现自己的MessageToByteEncoder将消息编码成二进制时,先写出消息长度再写出消息体
  2. 然后实现ByteToMessageDecoder(或ReplayingDecoder),在解码时先读取一个int,得到消息体长度,然后再读取指定长度的字节流解码成出消息体。

在这里插入图片描述

Netty心跳检测机制

Netty提供了一个IdleStateHandler可以用于进行心跳检测,我们可以设置读超时时间或写超时时间,比如我们设置了读超时时间,IdleStateHandler在指定时间内没有从通道中读取到数据,就会触发一个IdleStateEvent事件,IdleStateEvent中有一个state字段记录是什么类型的超时时间(读超时、写超时、读写超时)。

我们可以在ChannelPipeline添加一个IdleStateHandler,然后我们再继承SimpleChannelInboundHandler实现自定义的入站处理放于IdleStateHandler的后面,就可以在发生读超时或写超时事件时,在userEventTriggered(ChannelHandlerContext ctx, Object evt)方法中接收到IdleStateHandler发出的IdleStateEvent对象,我们就可以进行相应处理,比如读超时事件则进行探活处理或者关闭连接等操作。

在这里插入图片描述

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

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

相关文章

金蝶BI方案与奥威BI:智能、高效的数据分析组合

在当今数据驱动的时代&#xff0c;企业对于快速、准确、全面的数据分析需求日益增长。金蝶BI方案和奥威BI SaaS平台正是为满足这一需求而精心打造的智能数据分析工具。 方案见效快 金蝶BI方案以其高效的数据处理能力&#xff0c;能够快速地将海量数据转化为有价值的信息。通过…

跟《经济学人》学英文:2024年6月15日这期 America

America seems immune to the world economy’s problems 美国似乎对世界经济问题免疫 immune to&#xff1a;美 [ɪˈmjun tu] 对…有免疫力&#xff1b;不受…感染&#xff1b;不受…的影响&#xff1b;免疫耐受&#xff1b; Elsewhere, political dysfunction and fiscal…

api-ms-win-crt-runtime-l1-1-0.dll文件丢失的情况要怎么处理?比较靠谱的多种修复方法分享

遇到api-ms-win-crt-runtime-l1-1-0.dll文件丢失的情况实际上是一个常见问题&#xff0c;解决此类问题存在多种方法。首先我们先来了解一下api-ms-win-crt-runtime-l1-1-0.dll文件吧&#xff0c;只有了解了我们才知道怎么去解决这个api-ms-win-crt-runtime-l1-1-0.dll文件丢失的…

【机器学习】计算机图形和深度学习模型NeRF详解(2)

1. 引言 本文是"计算机图形和深度学习模型NeRF详解"系列文章的续篇&#xff0c;进一步深入探讨了NeRF的核心技术。NeRF作为一项突破性技术&#xff0c;因其能够从有限的2D图像中重建出完整的3D场景&#xff0c;而在多个领域&#xff0c;如医学成像、3D场景重建、动画…

Spring中网络请求客户端WebClient的使用详解

Spring中网络请求客户端WebClient的使用详解_java_脚本之家 Spring5的WebClient使用详解-腾讯云开发者社区-腾讯云 在 Spring 5 之前&#xff0c;如果我们想要调用其他系统提供的 HTTP 服务&#xff0c;通常可以使用 Spring 提供的 RestTemplate 来访问&#xff0c;不过由于 …

国际荐酒师携手各国际荐酒师专业委员会深化2024年度合作

国际荐酒师&#xff08;香港&#xff09;协会携手广东海上丝绸之路文化促进会及广东省城镇化发展研究会&#xff0c;深化2024年度合作&#xff0c;共同打造品荐与传播大师班培养荐酒师专业人材 近日&#xff0c;国际荐酒师&#xff08;香港&#xff09;协会、广东海上丝绸之路…

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications.

通过防抖动代码解决ResizeObserver loop completed with undelivered notifications. 一、报错内容二、解决方案解释&#xff1a; 一、报错内容 我通过el-tabs下的el-tab-pane切换到el-table出现的报错&#xff0c;大致是渲染宽度出现了问题 二、解决方案 扩展原生的 Resiz…

操作系统 文件系统

实验目的&#xff1a; 掌握文件系统设计的基本思想。理解掌握文件系统基本数据结构的设计。理解掌握文件操作中涉及的数据结构访问过程。 实验内容&#xff1a; 1、编程实现一个简单的内存文件系统。实现Linux常见的一些文件操作命令。比如&#xff1a;ls/cat/cp/rm等。 实…

足底筋膜炎怎么治疗效果好得快

足底筋膜炎症状&#xff1a;疼痛是足底筋膜炎最典型和常见的症状。患者通常会感到足跟或足底区域的疼痛&#xff0c;这种疼痛可能表现为刺痛、钝痛或灼热感。疼痛的程度和频率因人而异&#xff0c;但通常会在早晨起床后或长时间休息后首次站立时最为明显。这是因为休息时足底筋…

华为云与AWS负载均衡服务深度对比:性能、成本与可用性

随着云计算的迅速发展&#xff0c;企业对于云服务提供商的选择变得越来越关键。在选择云服务提供商时&#xff0c;负载均衡服务是企业关注的重点之一。我们九河云将深入比较两大知名云服务提供商华为云和AWS的负载均衡服务&#xff0c;从性能、成本和可用性等方面进行对比。 AW…

使用CAPL创建系统变量之sysDefineNamespace

目录 0 前言 1 使用CAPL创建系统变量 0 前言 最近在项目中发现可以通过CAPL来创建系统变量&#xff0c;这样方法在一定程度上提高了代码的统一性和测试的便利性。想要加入HIL自动化测试群的小伙伴欢迎评论区留言或私信&#xff0c;让我们一起进步&#xff01; 1 使用CAPL创建…

Java23种设计模式(一)

前言 这2个月来&#xff0c;重新出发&#xff0c;从java开发需要的数据库、查询日志工具、开发工具等的安装、环境配置&#xff0c;再到后面的基础学习、数据库学习、扩展学习&#xff08;maven、mq、设计模式、spring 系列等等&#xff09;&#xff0c;边学边记录&#xff0c…

typeScript debug 调试

以leetcode 20为例 0.首先编写代码 function isValid(s: string): boolean {let stack: string[] []for (let index 0; index < s.length; index) {let x: string s[index]debuggerswitch (x) {case (:stack.push())breakcase [:stack.push(])breakcase {:stack.push(})…

契约锁电子签章平台 add 远程命令执行漏洞复现(XVE-2023-23720)

0x01 产品简介 契约锁电子签章平台是上海亘岩网络科技有限公司推出的一套数字签章解决方案。契约锁为中大型组织提供“数字身份、电子签章、印章管控以及数据存证服务”于一体的数字可信基础解决方案,可无缝集成各类系统,让其具有电子化签署的能力,实现组织全程数字化办公。通…

java.lang.ClassNotFoundException: javafx.util.Pair的问题解决与原因详解

先说解决办法: 1、引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.12</version> </dependency>2、更换代码依赖地址&#xff1a; 原来依赖地址&#xff1a; import j…

中国首例!「DataKit」上架亚马逊云科技 Marketplace add-ons

在 2022 年的 re:Invent 大会上&#xff0c;亚马逊云科技宣布了一项重大更新&#xff1a;亚马逊云科技 Marketplace 为 Amazon Elastic Kubernetes Service&#xff08;Amazon EKS&#xff09;提供了附加组件的支持。这一创新功能极大地丰富了 EKS 的生态系统&#xff0c;使用户…

linux离线安装chrony服务校准时间

基础环境 Linux forlinx 5.10.35 #53 SMP PREEMPT Thu Mar 30 01:04:19 CST 2023 aarch64 aarch64 aarch64 GNU/Linux chrony源码包 下载地址&#xff1a;https://download.tuxfamily.org/chrony/ 以chrony-4.5.tar.gz举例说明 详细步骤 1.解压chrony tar zxvf chrony-4.…

办公楼导航系统:设计要点、功能实现与效益评估

随着现代办公楼的日益复杂化和规模化&#xff0c;如何高效、便捷地在楼宇内部进行定位和导航&#xff0c;已成为众多企业和员工关注的焦点。维小帮办公楼定位导航系统通过精准的定位和智能的导航功能&#xff0c;能够显著提升办公环境的智能化水平和办公效率。 一、维小帮办公…

SpringMVC系列四: Rest-优雅的url请求风格

Rest请求 &#x1f49e;Rest基本介绍&#x1f49e;Rest风格的url-完成增删改查需求说明代码实现HiddenHttpMethodFilter机制注意事项和细节 &#x1f49e;课后作业 上一讲, 我们学习的是SpringMVC系列三: Postman(接口测试工具) 现在打开springmvc项目 &#x1f49e;Rest基本介…

Scala语言:大数据开发的未来之星 - 零基础到精通入门指南

前言 随着大数据时代的到来&#xff0c;数据量的急剧增长为软件开发带来了新的挑战和机遇。Scala语言因其函数式编程和面向对象的特性&#xff0c;以及与Apache Spark的完美协作&#xff0c;在大数据开发领域迅速崛起&#xff0c;成为该领域的新兴宠儿。本篇将从零基础开始&…