一、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
二、具體實現
待續…