Netty的编解码器

  • Post author:
  • Post category:其他



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 累计丢弃的字节数



版权声明:本文为m0_37529488原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。