LengthFieldBasedFrameDecoder 基于长度字段的帧解码器
发布网友
发布时间:2023-02-26 21:02
我来回答
共1个回答
热心网友
时间:2023-10-18 18:39
在自定义协议中,我们把每一个协议个体称为一帧数据,对不同的请求或者响应每一帧的数据长度都基本不一样,同一个请求在不同时刻发出可能获得的响应长度也是不一样的,那么我们要如何获取完整的一帧数据呢?
LengthFieldBasedFrameDecoder 就是基于长度字段的帧解码器,理解该解码器知道两个东西就够了,长度字段在哪里?长度字段的值从哪里开始?
先来假设一帧数据,一开始我们是不知道这一帧数据有多长的,就像下面这样子,第一步我们就要找长度字段在哪里,说明是自定义协议,那么我们就规定前一个字节数据代表帧的长度,当然如果你喜欢你可以规定第3 个字节或者第3-4 个字段代表帧的长度。看下面的帧数据的第一个字节数据为 0x9C ,就是156,那么这156 怎么理解呢?
在自定义协议的时候一般格式为:协议头 + 消息体,不同的编码习惯可能在产生不同的封装实体,例如,1. 协议头封装为一个对象,消息体封装为一个对象;2. 还可以消息体对象包含了协议头。根据不同的封装方式就可能产生156 的开始位置不同,假设前四个字段是协议头,可以得出:
明白了上面两个问题之后再来看这个解密器就简单多了。
这个概念涉及到底层的知识,我们不关心,有一个构造方式没有该参数的,用那个就好。
超过该值得帧都不解密
这个是我们找长度字段的开始位置,看下面例子:
可以看到通过lengthFieldOffset 和 lengthFieldLength 我们知道了长度字段在哪里了。
到了这里我们确定长度字段的值了。
从字段的表面意思看:初始化的时候需要跳过多少个字节数,也是就是从哪里开始算的意思啦。
不抛出:不需要重连,但是发送发需要发送整帧数据,发送方当作接受方已经接受了数据。
抛出:需要重连。
了解了构造方法之后我们来算一下一帧数据的长度