Netty服务端使用LengthFieldBasedFrameDecoder解码,但是客户端不是使用Netty。当客户端发送的报文长度字段的值和实际报文长度不一致时,比如长度字段值是8,但是实际报文长度有10,会导致剩下的2字节数据当作下一帧的开头,会导致后续的帧也解码错误。请问这种情况改如何解决呢?
Netty服务端使用LengthFieldBasedFrameDecoder解码,但是客户端不是使用Netty。当客户端发送的报文长度字段的值和实际报文长度不一致时,比如长度字段值是8,但是实际报文长度有10,会导致剩下的2字节数据当作下一帧的开头,会导致后续的帧也解码错误。请问这种情况改如何解决呢?
断开链接,叫客户端严格按照协议发送数据帧。
建议放弃使用LengthFieldBasedFrameDecoder解码器
自定义包解码器,读取字节长度与结束标志,自己组包。
一般协议包会包含以下
hader body footer 。 header中描述长度,footer一般会包含结束标志。即使客户端header描述帧长度不对,也能依据footer标志来进行包分割,使下一个包正常。
你这种建议用自定义解码器,还有就是tcp存在粘包问题,需要自己手动拆包!
可以像http协议那样 前面固定都有HTTP开头,你可以在长度后面加个自己协议的魔数比如AABB,如果当前的TCP包解析完,还有剩余的byte数组未解析(出现粘包),就解析是不是正常AABB开头,不是的,当前包的剩余byte数组全部丢弃,下一个tcp包重新开始解析是不是AABB开头的
确定协议编解码器,然后处理拆包,连包的时候有一定规则,错误的到时候,断开连接或者弃包。
LengthFieldBasedFrameDecoder 完全可以解决这个问题,不明白的地方,直接看代码中的文档注释例子
为啥长度8,实际长度却是10?服务端没严格按照协议走?
协议要定义协议头,找下一个协议头重新开始
你的协议有缺陷