Netty常用编解码器
编解码器可以分为一次解码器和二次解码器,一次解码器用于解决 TCP 拆包/粘包问题,按协议解析后得到的字节数据。如果你需要对解析后的字节数据做对象模型的转换,这时候便需要用到二次解码器,同理编码器的过程是反过来的。
一次编解码器解决拆包/粘包问题,二次编解码器主要用于序列化。两次编/解码可以合并成一个,但是从分层和耦合性角度来说不推荐这样做。
固定长度解码器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 累计丢弃的字节数
|