Netty LengthFieldBasedFrameDecode詳解

一、LengthFieldBasedFrameDecode用法解析

構造函數:

    public LengthFieldBasedFrameDecoder(
            ByteOrder byteOrder, int maxFrameLength, int lengthFieldOffset, int lengthFieldLength,
            int lengthAdjustment, int initialBytesToStrip, boolean failFast) 

理解其用法,需要了解每個參數的作用。

下面以具體報文爲例,解釋每個參數需要怎麼去設置(例子來自Netty JavaDoc)。

例1

報文:
在這裏插入圖片描述
參數設置:
lengthFieldOffset: 0 #Length字段從消息的第一個字節開始,沒有偏移
lengthFieldLength: 2 #Length字段佔2字節
lengthAdjustment: 0 #Length的值,爲Actual Content的長度,不需要調整
initialBytesToStrip: 0 #返回的報文包括Length字段,不需要跳過字節

例2

報文:
在這裏插入圖片描述
參數設置:
例1相比,返回的報文不包含Length字段,因此:
lengthFieldOffset: 0
lengthFieldLength: 2
lengthAdjustment: 0
initialBytesToStrip: 2 #返回的報文包括Length字段,跳過2個字節

例3

報文:
在這裏插入圖片描述
參數設置:
例1相比,Length字段的值,包含了Length字段本身的長度,因此實際消息長度需要做調整:
lengthFieldOffset: 0
lengthFieldLength: 2
lengthAdjustment: -2 #減去Length字段本身的長度
initialBytesToStrip: 0

例4

報文:
在這裏插入圖片描述
參數設置:
此處,Length字段從第3個字節開始,因此lengthFieldOffset爲2:
lengthFieldOffset: 2 #跳過Header1所佔字節數(2個字節)
lengthFieldLength: 3 #Length字段佔3字節
lengthAdjustment: 0
initialBytesToStrip: 0

例5

報文:
在這裏插入圖片描述
參數設置:
此處,Length字段的值是Actual Content的長度,不包含Header1的長度,所以改長度要調整:
lengthFieldOffset: 0
lengthFieldLength: 3
lengthAdjustment: 2
initialBytesToStrip: 0

例6

報文:
在這裏插入圖片描述
參數設置:
這裏綜合了前面的幾種情況:
lengthFieldOffset: 1 #跳過HDR1
lengthFieldLength: 2 #Length字段佔2個字節
lengthAdjustment: 1 #加上HDR2的長度
initialBytesToStrip: 3 #跳過HDR1 + Length字段的長度

例7

報文:
在這裏插入圖片描述
參數設置:
例6相比,Length字段爲整個報文的長度,因此:
lengthFieldOffset: 1
lengthFieldLength: 2
lengthAdjustment: -3
initialBytesToStrip: 3

二、具體實現

待續…

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