FixedLengthFrameDecoder
继承自FixedLengthFrameDecoder有
- MarshallingDecoder
- ObjectDecoder
这2个都是用来对对象进行转换使用
比如接收到包下:
* +---+----+------+----+
* | A | BC | DEFG | HI |
* +---+----+------+----+
如果定义了new FixedLengthFrameDecoder(3)
会解析成
* +-----+-----+-----+
* | ABC | DEF | GHI |
* +-----+-----+-----+
LengthFieldBasedFrameDecoder
根据消息头里的长度字段来分隔消息
消息格式
- 消息头 : 有几个字节来标识消息体的长度,为Length
- 消息体
消息总长=消息头长+消息体长(Length)+lengthAdjustmen
针对这类的消息解析,可以使用netty提供的工具类LengthFieldBasedFrameDecoder来做,具体是通过
组合以下的几个字段来完成不同的情况的消息解析
lengthFieldOffset 标识消息体长度的字节集合 在一个消息字节里的开始位置
lengthFieldLength 标识消息体长度的字节集合总共有几个字节
lengthAdjustment 消息总长=消息头总长+消息体总长(Length)+lengthAdjustment
initialBytesToStrip 跳过哪几个字节长度
情况1 :
+--------+----------------+ +--------+----------------+
| Length | Actual Content |----->| Length | Actual Content |
| 0x000C | "HELLO, WORLD" | | 0x000C | "HELLO, WORLD" |
+--------+----------------+ +--------+----------------+
lengthFieldOffset 0 标识消息体长度的字节集合 在一个消息字节里的开始位置
lengthFieldLength 2 标识消息体长度的字节集合总共有几个字节
lengthAdjustment 0
initialBytesToStrip 0
情况2 : 情况1不想包含消息头
+--------+----------------+ +----------------+
| Length | Actual Content |----->| Actual Content |
| 0x000C | "HELLO, WORLD" | | "HELLO, WORLD" |
+--------+----------------+ +----------------+
lengthFieldOffset 0
lengthFieldLength 2
lengthAdjustment 0
initialBytesToStrip 2 跳过2个字段
情况3 :
消息总长=消息头总长+消息体总长(Length)
消息总长=2+17=19
本来消息中长只有17,现在变成19,肯定不对,所以通过设置lengthAdjustment=-2,最终
消息总长=2+17±2(lengthAdjustment)=17
+--------+----------------+ +--------+----------------+
| Length | Actual Content |----->| Length | Actual Content |
| 0x000E | "HELLO, WORLD" | | 0x000E | "HELLO, WORLD" |
+--------+----------------+ +--------+----------------+
lengthFieldOffset 0
lengthFieldLength 2
lengthAdjustment -2 调整长度为-2
initialBytesToStrip 0
情况 4:
消息总长是消息头总长+消息体总长(消息体总长是length),但是Header 1没有计算入内,要加入Header 1的长度,所以lengthAdjustment=2
+----------+----------+----------------+ +----------+----------+----------------+
| Length | Header 1 | Actual Content |----->| Length | Header 1 | Actual Content |
| 0x00000C | 0xCAFE | "HELLO, WORLD" | | 0x00000C | 0xCAFE | "HELLO, WORLD" |
+----------+----------+----------------+ +----------+----------+----------------+
lengthFieldOffset = 0
lengthFieldLength = 3
lengthAdjustment = 2
initialBytesToStrip = 0
情况 5: 情况4想跳过消息头
+------+--------+------+----------------+ +------+----------------+
| HDR1 | Length | HDR2 | Actual Content |----->| HDR2 | Actual Content |
| 0xCA | 0x000C | 0xFE | "HELLO, WORLD" | | 0xFE | "HELLO, WORLD" |
+------+--------+------+----------------+ +------+----------------+
lengthFieldOffset = 0
lengthFieldLength = 3
lengthAdjustment = 2
initialBytesToStrip = 3