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的粘包和分包