什么是 TCP 粘包/拆包?有什么解决办法呢?
Netty 88
TCP 粘包/拆包 就是你基于 TCP 发送数据的时候,出现了多个字符串“粘” 在了一起或者一个字符串被“拆”开的问题。比如你多次发送:“你好,你真帅啊!哥哥!”,但是客户端接收到的可能是下面这样的:
解决方法如下:
使用 Netty 自带的解码器
LineBasedFrameDecoder : 发送端发送数据包的时候,每个数据包之间以换 行符作为分隔,LineBasedFrameDecoder 的工作原理是它依次遍历 ByteBuf 中的可读字节,判断是否有换行符,然后进行相应的截取。 DelimiterBasedFrameDecoder : 可以自定义分隔符解码器, LineBasedFrameDecoder 实际上是一种特殊的 DelimiterBasedFrameDecoder 解码器。
FixedLengthFrameDecoder: 固定长度解码器,它能够按照指定的长度对消 息进行相应的拆包。
自定义序列化编解码器
在 Java 中自带的有实现 Serializable 接口来实现序列化,但由于它性能、安 全性等原因一般情况下是不会被使用到的。
通常情况下,我们使用 Protostuff、Hessian2、json 序列方式比较多,另外 还有一些序列化性能非常好的序列化方式也是很好的选择:
- 专门针对 Java 语言的:Kryo,FST 等等。
- 跨语言的:Protostuff(基于 protobuf 发展而来),ProtoBuf,Thrift,Avro,MsgPack 等等。