首页 > Web开发 > 详细

Netty解决粘包/半包问题

时间:2020-07-02 09:05:41      阅读:164      评论:0      收藏:0      [点我收藏+]

粘包与半包

在TCP协议中,数据流的传输是没有接线与分割的,数据块的划分根据缓冲区大小来决定,在数据包传输过程中,多个小数据包合并成一个大包进行传输,也可能一个数据包被划分成多个小包进行传输,这就是粘包与半包。可能性如下
技术分享图片

产生原因:

  • 应用程序write写入的字节大小 大于 套接字发送缓冲区大小
  • 进行MSS大小的TCP分段
  • 以太网帧的payload大于MTU进行IP分片

一般解决方案

  1. 定长消息,例如每个报文长度固定,不够补空格
  2. 使用回车换行符分割,在包尾加上分割符,例如Ftp协议
  3. 消息分割,头为长度(消息总长度或消息体长度),通常头用一个int32表示
  4. 复杂的应用层协议

Netty解决方案

通过添加数据解码器对数据进行拆分处理。

特殊分隔符解码器

LineBasedFrameDecoder

ch.pipeline().addLast(new LineBasedFrameDecoder(1024));

DelimiterBasedFrameDecoder

ByteBuf delimiter = Unpooled.copiedBuffer("&".getBytes());
ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024,c delimiter));

定长数据解码器

FixedLengthFrameDecoder

ch.pipeline().addLast(new FixedLengthFrameDecoder(1024));

基于数据头部不定长数据解码器

LengthFieldBasedFrameDecoder

ch.pipeline().addLast(new LengthFieldBasedFrameDecoder(Integer.MAX, 0, 4););

Netty解决粘包/半包问题

原文:https://www.cnblogs.com/nickhan/p/13222492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!