什么是 TCP 粘包/拆包?有什么解决办法呢?

Johngo学长 Netty 88

TCP 粘包/拆包 就是你基于 TCP 发送数据的时候,出现了多个字符串“粘” 在了一起或者一个字符串被“拆”开的问题。比如你多次发送:“你好,你真帅啊!哥哥!”,但是客户端接收到的可能是下面这样的:

netty1

解决方法如下:

使用 Netty 自带的解码器

LineBasedFrameDecoder : 发送端发送数据包的时候,每个数据包之间以换 行符作为分隔,LineBasedFrameDecoder 的工作原理是它依次遍历 ByteBuf 中的可读字节,判断是否有换行符,然后进行相应的截取。 DelimiterBasedFrameDecoder : 可以自定义分隔符解码器, LineBasedFrameDecoder 实际上是一种特殊的 DelimiterBasedFrameDecoder 解码器。

FixedLengthFrameDecoder: 固定长度解码器,它能够按照指定的长度对消 息进行相应的拆包。

自定义序列化编解码器

在 Java 中自带的有实现 Serializable 接口来实现序列化,但由于它性能、安 全性等原因一般情况下是不会被使用到的。
通常情况下,我们使用 Protostuff、Hessian2、json 序列方式比较多,另外 还有一些序列化性能非常好的序列化方式也是很好的选择:

  • 专门针对 Java 语言的:Kryo,FST 等等。
  • 跨语言的:Protostuff(基于 protobuf 发展而来),ProtoBuf,Thrift,Avro,MsgPack 等等。

回复

我来回复
  • 暂无回复内容

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载