Netty的编解码器

Netty的编解码器,第1张

Netty的编解码器

Netty常用编解码器

Netty 常用编码器

MessageToByteEncoder 对象编码成字节流

MessageToMessageEncoder 一种消息类型编码成另外一种消息类型

Netty 常用解码器

ByteToMessageDecoder/ReplayingDecoder 将字节流解码为消息对象

MessageToMessageDecoder 将一种消息类型解码为另外一种消息类型

编解码器可以分为一次解码器和二次解码器,一次解码器用于解决 TCP 拆包/粘包问题,按协议解析后得到的字节数据。如果你需要对解析后的字节数据做对象模型的转换,这时候便需要用到二次解码器,同理编码器的过程是反过来的。

一次编解码器:MessageToByteEncoder/ByteToMessageDecoder。

二次编解码器:MessageToMessageEncoder/MessageToMessageDecoder

一次编解码器解决拆包/粘包问题,二次编解码器主要用于序列化。两次编/解码可以合并成一个,但是从分层和耦合性角度来说不推荐这样做。

固定长度解码器FixedLengthframeDecoder

通过构造函数设置固定长度的大小 frameLength,无论接收方一次获取多大的数据,都会严格按照 frameLength 进行解码。如果累积读取到长度大小为 frameLength 的消息,那么解码器认为已经获取到了一个完整的消息。如果消息长度小于 frameLength,FixedLengthframeDecoder 解码器会一直等后续数据包的到达,直至获得完整的消息。

特殊分隔符解码器DelimiterbasedframeDecoder

delimiters 指定特殊分隔符,通过写入 ByteBuf 作为参数传入。delimiters 的类型是 ByteBuf 数组,所以我们可以同时指定多个分隔符,但是最终会选择长度最短的分隔符进行消息拆分。

maxLength 是报文最大长度的限制。如果超过 maxLength 还没有检测到指定分隔符,将会抛出 TooLongframeException。可以说 maxLength 是对程序在极端情况下的一种保护措施。

failFast 与 maxLength 需要搭配使用,通过设置 failFast 可以控制抛出 TooLongframeException 的时机,可以说 Netty 在细节上考虑得面面俱到。如果 failFast=true,那么在超出 maxLength 会立即抛出 TooLongframeException,不再继续进行解码。如果 failFast=false,那么会等到解码出一个完整的消息后才会抛出 TooLongframeException。

stripDelimiter 的作用是判断解码后得到的消息是否去除分隔符。如果 stripDelimiter=false,特定分隔符为 n

长度域解码器LengthFieldbasedframeDecoder(推荐)

长度域解码器 LengthFieldbasedframeDecoder 是解决 TCP 拆包/粘包问题最常用的解码器

maxframeLength 报文最大限制长度

lengthFieldOffset 长度字段的偏移量,也就是存放长度数据的起始位置

lengthFieldLength 长度字段所占用的字节数

lengthFieldEndOffset 长度字段结束的偏移量,lengthFieldEndOffset = lengthFieldOffset + lengthFieldLength

lengthAdjustment 消息长度的修正值,lengthAdjustment = 包体的长度值 - 长度域的值

initialBytesToStrip 解码后需要跳过的初始字节数,也就是消息内容字段的起始位置

failFast 是否立即抛出 TooLongframeException,与 maxframeLength 搭配使用

discardingTooLongframe 是否处于丢弃模式

tooLongframeLength 需要丢弃的字节数

bytesToDiscard 累计丢弃的字节数

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5719576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-18
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存