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