什么是粘包和半包?

粘包的主要原因:

• 发送方每次写入数据 < 套接字缓冲区大小

• 接收方读取套接字缓冲区数据不够及时

半包的主要原因:

• 发送方写入数据 > 套接字缓冲区大小

• 发送的数据大于协议的 MTU(Maximum Transmission Unit,最大传输单元),必须拆包

TCP 粘包、半包 Netty 全搞定

 

TCP 粘包、半包 Netty 全搞定

 

为什么 TCP 应用中会出现粘包和半包现象?

根本原因:

TCP 是流式协议,消息无边界。

提醒:UDP 像邮寄的包裹,虽然一次运输多个,但每个包裹都有“界限”,一个一个签收,

所以无粘包、半包问题。

 

解决粘包和半包问题的几种常用方法

 

解决问题的根本手段:找出消息的边界

Netty 对三种常用封帧方式的支持

 

TCP 粘包、半包 Netty 全搞定

 

实战中使用 protobuf 协议系列化:

protobuf是google序列化的工具,主要是把数据序列化成二进制的数据来传输用的。它主要优点如下:

1.性能好,效率高;

2.跨语言(java自带的序列化,不能跨语言)

其实,在netty中使用Protobuf需要注意的是:

protobufDecoder仅仅负责编码,并不支持读半包,所以在之前,一定要有读半包的处理器。

有三种方式可以选择

TCP 粘包、半包 Netty 全搞定

 

使用netty提供ProtobufVarint32FrameDecoder

继承netty提供的通用半包处理器 LengthFieldBasedFrameDecoder

继承ByteToMessageDecoder类,自己处理半包

 

TCP 粘包、半包 Netty 全搞定

 

TCP 粘包、半包 Netty 全搞定

 

解读 Netty 处理粘包、半包的源码

 

• 一次解码器:ByteToMessageDecoder

• io.netty.buffer.ByteBuf (原始数据流)-> io.netty.buffer.ByteBuf (用户数据)

TCP 粘包、半包 Netty 全搞定

 

• 二次解码器:MessageToMessageDecoder<I>

• io.netty.buffer.ByteBuf (用户数据)-> Java Object

TCP 粘包、半包 Netty 全搞定

 

选择编解码方式的要点

相关文章:

  • 2022-01-05
  • 2021-10-02
  • 2021-11-04
  • 2022-12-23
  • 2022-01-15
  • 2021-05-31
猜你喜欢
  • 2022-12-23
  • 2021-08-13
  • 2021-08-08
  • 2022-12-23
  • 2021-05-26
  • 2019-10-23
  • 2019-10-24
相关资源
相似解决方案