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

Netty技术全解析:DelimiterBasedFrameDecoder类深度解析

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

Netty是一个高性能的网络编程框架,它提供了丰富的编解码器(Codec)来简化网络数据的处理。在Netty中,DelimiterBasedFrameDecoder是一个关键的解码器组件,它用于处理基于分隔符的帧划分。本文将结合Netty的源码,详细分析DelimiterBasedFrameDecoder类的工作原理、实现细节以及使用场景。

文章目录

      • 一、DelimiterBasedFrameDecoder类概述
      • 二、源码解析
      • 三、工作原理
      • 四、使用场景
      • 五、注意事项
      • 六、结语

一、DelimiterBasedFrameDecoder类概述

DelimiterBasedFrameDecoder是Netty提供的一个解码器,它继承自ByteToMessageDecoder类。这个解码器的主要作用是将接收到的字节流按照指定的分隔符进行划分,每个分隔符之间的内容被视为一个独立的帧(Frame)。这样,上层应用就可以逐个处理这些帧,而不需要关心底层字节流的划分。

二、源码解析

首先,我们来看一下DelimiterBasedFrameDecoder的核心源码结构。

public class DelimiterBasedFrameDecoder extends ByteToMessageDecoder {private final ByteBuf delimiter;private final int maxFrameLength;private final boolean stripDelimiter;private final boolean discardDelimitedFrames;private ByteBuf buffer;public DelimiterBasedFrameDecoder(int maxFrameLength, ByteBuf delimiter) {this(maxFrameLength, delimiter, true, true);}public DelimiterBasedFrameDecoder(int maxFrameLength, ByteBuf delimiter, boolean stripDelimiter, boolean discardDelimitedFrames) {if (maxFrameLength <= 0) {throw new IllegalArgumentException("maxFrameLength must be a positive integer: " + maxFrameLength);}if (delimiter == null) {throw new NullPointerException("delimiter");}this.maxFrameLength = maxFrameLength;this.delimiter = delimiter.slice();this.stripDelimiter = stripDelimiter;this.discardDelimitedFrames = discardDelimitedFrames;}@Overrideprotected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {// ... 解码逻辑,后续详细分析}
}

从源码中可以看出,DelimiterBasedFrameDecoder类有多个构造函数,允许用户设置最大帧长度、分隔符、是否剥离分隔符以及是否丢弃已分隔的帧。解码逻辑主要集中在decode方法中。

三、工作原理

  1. 帧划分

    • DelimiterBasedFrameDecoder通过指定的分隔符来划分帧。它会遍历输入的ByteBuf,查找分隔符的出现位置。
    • 当找到一个完整的分隔符时,分隔符之前的内容被视为一个独立的帧。
  2. 帧处理

    • 如果stripDelimiter设置为true,则在将帧添加到输出列表之前,会从帧中剥离分隔符。
    • 如果discardDelimitedFrames设置为true,则已分隔的帧会被丢弃,不会添加到输出列表中。
  3. 长度限制

    • maxFrameLength参数用于限制帧的最大长度。如果找到一个分隔符,但分隔符之前的内容长度超过了maxFrameLength,则会抛出一个异常。

四、使用场景

DelimiterBasedFrameDecoder适用于那些使用特定分隔符来划分帧的网络通信协议。例如,某些文本协议可能使用换行符(\n)或回车换行符(\r\n)作为消息的分隔符。在这种情况下,使用DelimiterBasedFrameDecoder可以方便地处理消息划分。

五、注意事项

  1. 分隔符设置

    • 在使用DelimiterBasedFrameDecoder时,需要设置正确的分隔符。如果设置的分隔符与实际协议不符,可能会导致无法正确解码或解码出错误的数据。
  2. 最大帧长度

    • maxFrameLength参数用于防止恶意构造的超长帧导致的内存溢出问题。在实际应用中,需要根据协议规范和网络环境合理设置该参数。
  3. 性能考虑

    • 由于DelimiterBasedFrameDecoder需要遍历输入的ByteBuf来查找分隔符,因此在处理大量数据时可能会产生一定的性能开销。在实际应用中,需要根据具体场景进行性能评估和优化。
  4. 线程安全

    • DelimiterBasedFrameDecoder本身不是线程安全的。如果你的应用涉及到多线程处理网络数据,需要确保解码器的使用是线程安全的。

六、结语

DelimiterBasedFrameDecoder是Netty中用于处理基于分隔符的帧划分的解码器。通过提供简单的帧划分策略,它使得开发者可以更容易地编写基于分隔符的网络通信程序。希望本文能够帮助开发者更好地理解DelimiterBasedFrameDecoder类的工作原理和使用方法,并在实际开发中充分利用其提供的便利。在实际应用中,建议结合具体协议和场景进行充分的测试和性能评估,以确保系统的稳定性和高效性。


关注公众号[码到三十五]获取更多技术干货 !

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL增删改查(基础)
  • Java入门基础17:集合框架2(可变参数、Collections、Map系列集合、集合的嵌套、Stream流)
  • 不知道msvcp140.dll丢失的解决方法有哪些?看这篇文章教你修复丢失的msvcp140.dll
  • 8月9日笔记
  • Leetcode 17.电话号码的字母组合
  • SpringBoot自动装配原理
  • 探索 Go 语言的 json 库
  • 1Panel应用推荐:KubePi开源Kubernetes管理面板
  • 【运维项目经历|040】高可用Web服务平台:LVS+Apache集群+NFS共享存储系统
  • C 循环
  • GNU/Linux - memtool使用
  • 【YOLOV8】YOLOV8模型训练train及参数详解
  • 12322222222
  • 零基础5分钟上手亚马逊云科技AWS核心云架构知识-用S3桶托管静态网页
  • 2940 找到Alice和Bob可以相遇的建筑 (944/951)超时
  • eclipse(luna)创建web工程
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • jQuery(一)
  • php ci框架整合银盛支付
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Spring声明式事务管理之一:五大属性分析
  • 规范化安全开发 KOA 手脚架
  • 技术发展面试
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端相关框架总和
  • 前端之Sass/Scss实战笔记
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 首页查询功能的一次实现过程
  • 我的zsh配置, 2019最新方案
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​决定德拉瓦州地区版图的关键历史事件
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #宝哥教你#查看jquery绑定的事件函数
  • $分析了六十多年间100万字的政府工作报告,我看到了这样的变迁
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (js)循环条件满足时终止循环
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (定时器/计数器)中断系统(详解与使用)
  • (分类)KNN算法- 参数调优
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (免费领源码)python#django#mysql公交线路查询系统85021- 计算机毕业设计项目选题推荐
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • (转载)OpenStack Hacker养成指南
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .NET程序集编辑器/调试器 dnSpy 使用介绍
  • .Net的DataSet直接与SQL2005交互
  • /bin/bash^M: bad interpreter: No such file ordirectory