常用于处理数据分包传输问题,先对构造方法LengthFieldBasedFrameDecoder中的参数做以下说明:
maxFrameLength:接受包的最大长度
lengthFieldOffset:长度属性的偏移位,即读取包长度时从lengthFieldOffset起往后读lengthFieldLength个字节表示长度
lengthFieldLength:长度属性的长度,即存放整个大数据包长度的字节所占的长度,通常为1, 2, 3, 4, or 8
lengthAdjustment:包长度的补偿值,即真实的消息长度为根据lengthFieldOffset和lengthFieldLength属性读出的长度 +lengthAdjustment
initialBytesToStrip:跳过多少个字节,以便接收端直接接受到不含“长度属性”的内容,一般为 (lengthFieldOffset+lengthFieldLength)个字节
failFast :默认为true,当frame长度超过maxFrameLength时立即报TooLongFrameException异常,为false,读取完整个帧再报异常
下面实例演示:
1、包的长度为4个字节,解码后的消息包含长度属性
new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 0, false)
解码前 解码后
长度+具体内容 长度+具体内容
[0, 0, 0, 5, 104, 101, 108, 108, 111] [0, 0, 0, 5, 104, 101, 108, 108, 111]
2、包的长度为4个字节,解码后的消息不包含长度
new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4, false)
解码前 解码后
长度+具体内容 长度+具体内容
[0, 0, 0, 5, 104, 101, 108, 108, 111] [104, 101, 108, 108, 111]
3、lengthFieldOffset为1,解码后的消息不包含长度
new LengthFieldBasedFrameDecoder(1024, 1, 4, 0, 5, false)
解码前 解码后
长度+具体内容 长度+具体内容
[1, 0, 0, 0, 5, 104, 101, 108, 108, 111] [104, 101, 108, 108, 111]
lengthFieldOffset为1,即消息内容的长度从第2个字节读,长度为5。initialBytesToStrip为获取去除前面5个字节的消息,即最后的消息内容为[104, 101, 108, 108, 111]
4、lengthAdjustment为1,解码后的消息不包含长度
new LengthFieldBasedFrameDecoder(1024, 0, 4, 1, 4, false)
解码前 解码后
长度+具体内容 长度+具体内容
[0, 0, 0, 4, 104, 101, 108, 108, 111] [104, 101, 108, 108, 111]
读取前4个字节,消息的长度为4。因为lengthAdjustment为1,即消息内容的实际长度为4+1=5个字节,读取后5个字节为最后解码后的消息