我的编程空间,编程开发者的网络收藏夹
学习永远不晚

netty中的frame解码器怎么用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

netty中的frame解码器怎么用

这篇文章主要介绍“netty中的frame解码器怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“netty中的frame解码器怎么用”文章能帮助大家解决问题。

简介

netty中的数据是通过ByteBuf来进行传输的,一个ByteBuf中可能包含多个有意义的数据,这些数据可以被称作frame,也就是说一个ByteBuf中可以包含多个Frame。

对于消息的接收方来说,接收到了ByteBuf,还需要从ByteBuf中解析出有用而数据,那就需要将ByteBuf中的frame进行拆分和解析。

一般来说不同的frame之间会有有些特定的分隔符,我们可以通过这些分隔符来区分frame,从而实现对数据的解析。

netty为我们提供了一些合适的frame解码器,通过使用这些frame解码器可以有效的简化我们的工作。下图是netty中常见的几个frame解码器:

netty中的frame解码器怎么用

接下来我们来详细介绍一下上面几个frame解码器的使用。

LineBasedFrameDecoder

LineBasedFrameDecoder从名字上看就是按行来进行frame的区分。根据操作系统的不同,换行可以有两种换行符,分别是 “\n” 和 “\r\n” 。

LineBasedFrameDecoder的基本原理就是从ByteBuf中读取对应的字符来和"\n" 跟 “\r\n”,可以了可以准确的进行字符的比较,这些frameDecoder对字符的编码也会有一定的要求,一般来说是需要UTF-8编码。因为在这样的编码中,“\n"和”\r"是以一个byte出现的,并且不会用在其他的组合编码中,所以用"\n"和"\r"来进行判断是非常安全的。

LineBasedFrameDecoder中有几个比较重要的属性,一个是maxLength的属性,用来检测接收到的消息长度,如果超出了长度限制,则会抛出TooLongFrameException异常。

还有一个stripDelimiter属性,用来判断是否需要将delimiter过滤掉。

还有一个是failFast,如果该值为true,那么不管frame是否读取完成,只要frame的长度超出了maxFrameLength,就会抛出TooLongFrameException。如果该值为false,那么TooLongFrameException会在整个frame完全读取之后再抛出。

LineBasedFrameDecoder的核心逻辑是先找到行的分隔符的位置,然后根据这个位置读取到对应的frame信息,这里来看一下找到行分隔符的findEndOfLine方法:

private int findEndOfLine(final ByteBuf buffer) {        int totalLength = buffer.readableBytes();        int i = buffer.forEachByte(buffer.readerIndex() + offset, totalLength - offset, ByteProcessor.FIND_LF);        if (i >= 0) {            offset = 0;            if (i > 0 && buffer.getByte(i - 1) == '\r') {                i--;            }        } else {            offset = totalLength;        }        return i;    }

这里使用了一个ByteBuf的forEachByte对ByteBuf进行遍历。我们要找的字符是:ByteProcessor.FIND_LF。

最后LineBasedFrameDecoder解码之后的对象还是一个ByteBuf。

DelimiterBasedFrameDecoder

上面讲的LineBasedFrameDecoder只对行分隔符有效,如果我们的frame是以其他的分隔符来分割的话LineBasedFrameDecoder就用不了了,所以netty提供了一个更加通用的DelimiterBasedFrameDecoder,这个frameDecoder可以自定义delimiter:

public class DelimiterBasedFrameDecoder extends ByteToMessageDecoder {        public DelimiterBasedFrameDecoder(int maxFrameLength, ByteBuf delimiter) {        this(maxFrameLength, true, delimiter);    }

传入的delimiter是一个ByteBuf,所以delimiter可能不止一个字符。

为了解决这个问题在DelimiterBasedFrameDecoder中定义了一个ByteBuf的数组:

 private final ByteBuf[] delimiters;    delimiters= delimiter.readableBytes();

这个delimiters是通过调用delimiter的readableBytes得到的。

DelimiterBasedFrameDecoder的逻辑和LineBasedFrameDecoder差不多,都是通过对比bufer中的字符来对bufer中的数据进行截取,但是DelimiterBasedFrameDecoder可以接受多个delimiters,所以它的用处会根据广泛。

FixedLengthFrameDecoder

除了进行ByteBuf中字符比较来进行frame拆分之外,还有一些其他常见的frame拆分的方法,比如根据特定的长度来区分,netty提供了一种这样的decoder叫做FixedLengthFrameDecoder。

public class FixedLengthFrameDecoder extends ByteToMessageDecoder

FixedLengthFrameDecoder也是继承自ByteToMessageDecoder,它的定义很简单,可以传入一个frame的长度:

public FixedLengthFrameDecoder(int frameLength) {        checkPositive(frameLength, "frameLength");        this.frameLength = frameLength;    }

然后调用ByteBuf的readRetainedSlice方法来读取固定长度的数据:

in.readRetainedSlice(frameLength)

最后将读取到的数据返回。

LengthFieldBasedFrameDecoder

还有一些frame中包含了特定的长度字段,这个长度字段表示ByteBuf中有多少可读的数据,这样的frame叫做LengthFieldBasedFrame。

netty中也提供了一个对应的处理decoder:

public class LengthFieldBasedFrameDecoder extends ByteToMessageDecoder

读取的逻辑很简单,首先读取长度,然后再根据长度再读取数据。为了实现这个逻辑,LengthFieldBasedFrameDecoder提供了4个字段,分别是 lengthFieldOffset,lengthFieldLength,lengthAdjustment和initialBytesToStrip。

lengthFieldOffset指定了长度字段的开始位置,lengthFieldLength定义的是长度字段的长度,lengthAdjustment是对lengthFieldLength进行调整,initialBytesToStrip表示是否需要去掉长度字段。

听起来好像不太好理解,我们举几个例子,首先是最简单的:

BEFORE DECODE (14 bytes)         AFTER DECODE (14 bytes)   +--------+----------------+      +--------+----------------+   | Length | Actual Content |----->| Length | Actual Content |   | 0x000C | "HELLO, WORLD" |      | 0x000C | "HELLO, WORLD" |   +--------+----------------+      +--------+----------------+

要编码的消息有个长度字段,长度字段后面就是真实的数据,0x000C是一个十六进制,表示的数据是12,也就是"HELLO, WORLD" 中字符串的长度。

这里4个属性的值是:

lengthFieldOffset   = 0   lengthFieldLength   = 2   lengthAdjustment    = 0   initialBytesToStrip = 0

表示的是长度字段从0开始,并且长度字段占有两个字节,长度不需要调整,也不需要对字段进行调整。

再来看一个比较复杂的例子,在这个例子中4个属性值如下:

 lengthFieldOffset   = 1     lengthFieldLength   = 2   lengthAdjustment    = 1     initialBytesToStrip = 3

对应的编码数据如下所示:

BEFORE DECODE (16 bytes)                       AFTER DECODE (13 bytes)   +------+--------+------+----------------+      +------+----------------+   | HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |   | 0xCA | 0x000C | 0xFE | "HELLO, WORLD" |      | 0xFE | "HELLO, WORLD" |   +------+--------+------+----------------+      +------+----------------+

上面的例子中长度字段是从第1个字节开始的(第0个字节是HDR1),长度字段占有2个字节,长度再调整一个字节,最终数据的开始位置就是1+2+1=4,然后再截取前3个字节的数据,得到了最后的结果。

关于“netty中的frame解码器怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

netty中的frame解码器怎么用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

netty中的frame解码器怎么用

这篇文章主要介绍“netty中的frame解码器怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“netty中的frame解码器怎么用”文章能帮助大家解决问题。简介netty中的数据是通过Byte
2023-06-30

netty中常用的xml编码解码器怎么用

这篇文章主要讲解了“netty中常用的xml编码解码器怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“netty中常用的xml编码解码器怎么用”吧!简介在json之前,xml是最常用的数
2023-06-30

怎么在Netty中注解使用Service或者Mapper

这篇文章主要介绍了怎么在Netty中注解使用Service或者Mapper,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Netty注解使用Service或MapperSpri
2023-06-29

Netty分布式解码器读取数据不完整的逻辑是什么

这篇文章将为大家详细讲解有关Netty分布式解码器读取数据不完整的逻辑是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述如果Server在读取客户端的数据的时候, 如果一次读取不完整, 就触发cha
2023-06-29

怎么理解Python中的编码

这篇文章主要介绍“怎么理解Python中的编码”,在日常操作中,相信很多人在怎么理解Python中的编码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Python中的编码”的疑惑有所帮助!接下来,请跟
2023-06-02

怎么理解PHP中JSON的编码与转码

这篇文章主要介绍“怎么理解PHP中JSON的编码与转码”,在日常操作中,相信很多人在怎么理解PHP中JSON的编码与转码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解PHP中JSON的编码与转码”的疑
2023-06-25

怎么理解Java1.7中的HashMap源码

本篇内容主要讲解“怎么理解Java1.7中的HashMap源码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Java1.7中的HashMap源码”吧!存储结构内部包含了一个 Entry
2023-06-25

JS代码编译器中Monaco怎么用

这篇文章给大家分享的是有关JS代码编译器中Monaco怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言我的需求是可以语法高亮、函数提示功能、自动换行、代码折叠MonacoMonaco是微软家的,支持的语言
2023-06-15

URL地址中的中文乱码怎么解决

本篇内容主要讲解“URL地址中的中文乱码怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“URL地址中的中文乱码怎么解决”吧!1. 问题的引出 在Restful的服务设计中,查询某些信
2023-06-02

windows云服务器中文乱码怎么解决

Windows云服务器中文乱码解决指南当Windows云服务器上出现中文乱码时,通常是由于字符集编码不匹配、字体缺失或区域设置错误造成的。本指南提供了一系列解决方案,包括:检查字符集编码并更改为UTF-8或GBK安装中文字体,例如"MicrosoftYaHei"或"宋体"配置区域设置,将"语言"设置为"简体中文","格式"为"中国"清除浏览器缓存、禁用防火墙或联系技术支持遵循这些步骤并采用最佳实践,可以解决Windows云服务器上中文乱码问题,确保中文文本正确显示。
windows云服务器中文乱码怎么解决
2024-04-12

windows云服务器中文乱码怎么解决

在Windows云服务器中出现中文乱码问题,可以尝试以下方法解决:1. 修改系统区域和语言设置:在控制面板中找到“区域和语言”选项,将相关设置修改为中国的区域和语言。2. 修改命令行编码:打开命令行工具,输入命令 "chcp 65001",
2023-09-22

Vue3中怎么实现二维码的生成与解码

本文小编为大家详细介绍“Vue3中怎么实现二维码的生成与解码”,内容详细,步骤清晰,细节处理妥当,希望这篇“Vue3中怎么实现二维码的生成与解码”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。使用到的库npm i
2023-07-05

Python中怎么调用解释器

Python中怎么调用解释器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python解释器调用代码示例:#include < iostream> #include < str
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录