Netty中LengthFieldBasedFrameDecoder解码器的lengthFieldLength参数取值只支持1,2,3,4,8几种长度的解决办法
Netty是一个非常优秀的 Java 网络编程框架,今天说一个基于Netty框架实现的TCP协议自定义报文长度的接口解决方案。
相信找到这篇文章的你,已经了解了Netty框架的基本工作原理,所以我就不过多赘述了,浪费时间。
项目中要求使用TCP协议完成请求的接收,并且整个数据包中前面7位是长度域,即服务端根据前7位获取整个报文信息的长度,截取做解析。格式如下
我用的是LengthFieldBasedFrameDecoder(基于长度字段的帧解码器), 该解码器的构造方法共5个重要参数:
项目 | Value |
---|---|
maxFrameLength | 发送的数据帧最大长度 |
lengthFieldOffset | 定义长度域位于发送的字节数组中的下标 |
lengthFieldLength | 用于描述定义的长度域的长度默认只支持 1, 2, 3, 4, or 8 |
lengthAdjustment | 偏移位,即:长度字节和内容中间隔了几个字节 |
initialBytesToStrip | 表示获取完一个完整的数据包之后,忽略前面的几个字节 |
从上表中可以看出lengthFieldLength长度域的长度只支持1,2,3,4,8这五种长度,我项目要求为7位,接口接收数据会报错
io.netty.handler.codec.DecoderException: unsupported lengthFieldLength: 7 (expected: 1, 2, 3, 4, or 8)
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.getUnadjustedFrameLength(LengthFieldBasedFrameDecoder.java:472) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:408) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:334) ~[netty-all-4.1.36.Final.jar:4.1.36.Final]
at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java: