Netty的粘包/拆包

682 阅读1分钟

1、正常包
2、粘包
3、拆包

出现的原因

1、write写入的字节大小大于socket发送缓冲区的大小
2、mss大小进行可分段
3、以太网的payload大于mtu的IP分片
(后面两个我也不知道啥意思)

解决办法

1、 消息定长
2、 在包尾增加回车换行符等特殊符号进行分割
3、将消息分为消息头和消息体,消息头有长度等信息
4、自定义实现报文

在netty中的实现

1、LineBasedFrameDecoder

LineBasedFrameDecoder解码器遍历ByteBuf中的可读字节,判断是否有\n或者\r\n。
如果有的话,从读的索引开始组成一行。 如果读到最大长度依然没有发现换行符,就会抛出异常,然后扔了已读的字节码流。

StringDecoder()解码器 将bytebuf转为String类型

2、DelimiterBasedFrameDecoder

自动完成以“$_”分隔符做结束标志的消息的解码

其中1024代表单挑消息的最大长度。超长则报异常

3、FixedLengthFrameDecoder

自动完成对定长消息20个字节的解码

3、LengthFieldBasedFrameDecoder 和LengthFiledPrepender

可以结合MessagePack快速实现对POJO的粘包和分包