LengthFieldBasedFrameDecoder

来源:互联网 发布:java中的finalize方法 编辑:程序博客网 时间:2024/05/16 17:58

常用于处理数据分包传输问题,先对构造方法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个字节为最后解码后的消息






0 0
原创粉丝点击