+
 新版

Netty服务端使用非定长帧解码器,客户端帧长度计算错误如何处理?

敖尔曼 发布于 2020/05/07 11:18
阅读 732
收藏 0

Netty服务端使用LengthFieldBasedFrameDecoder解码,但是客户端不是使用Netty。当客户端发送的报文长度字段的值和实际报文长度不一致时,比如长度字段值是8,但是实际报文长度有10,会导致剩下的2字节数据当作下一帧的开头,会导致后续的帧也解码错误。请问这种情况改如何解决呢?

加载中
0
GreysonYee
GreysonYee

断开链接,叫客户端严格按照协议发送数据帧。

敖尔曼
但是协议要求的是,当客户端发送帧格式不正确时,丢弃该帧,不能断开连接啊。现在问题是丢弃该帧,其他帧还是会被影响,发生偏移,导致解析出错
0
storm_
storm_

建议放弃使用LengthFieldBasedFrameDecoder解码器

自定义包解码器,读取字节长度与结束标志,自己组包。

一般协议包会包含以下

hader   body   footer 。  header中描述长度,footer一般会包含结束标志。即使客户端header描述帧长度不对,也能依据footer标志来进行包分割,使下一个包正常。

0
独孤晓林

你这种建议用自定义解码器,还有就是tcp存在粘包问题,需要自己手动拆包!

0
果果-hh

可以像http协议那样 前面固定都有HTTP开头,你可以在长度后面加个自己协议的魔数比如AABB,如果当前的TCP包解析完,还有剩余的byte数组未解析(出现粘包),就解析是不是正常AABB开头,不是的,当前包的剩余byte数组全部丢弃,下一个tcp包重新开始解析是不是AABB开头的

敖尔曼
嗯嗯,可行。dubbo协议的帧解码就是这样的
0
今幕明
今幕明

确定协议编解码器,然后处理拆包,连包的时候有一定规则,错误的到时候,断开连接或者弃包。

0
JackChang
JackChang

LengthFieldBasedFrameDecoder  完全可以解决这个问题,不明白的地方,直接看代码中的文档注释例子

0
君君要上天哈
君君要上天哈

为啥长度8,实际长度却是10?服务端没严格按照协议走?

0
jingshishengxu
jingshishengxu

协议要定义协议头,找下一个协议头重新开始

0
o
osc_2958431

你的协议有缺陷

OSCHINA
登录后可查看更多优质内容
返回顶部
顶部