Netty的幾種Decoder的說明

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章