当前位置:首页 > 科技  > 软件

拼多多面试:Netty如何解决粘包问题?

来源: 责编: 时间:2024-06-05 17:46:36 78观看
导读粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题。从严格意义上来说,粘包问题和拆包问题属于两个不

kvc28资讯网——每日最新资讯28at.com

粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题。kvc28资讯网——每日最新资讯28at.com

从严格意义上来说,粘包问题和拆包问题属于两个不同的问题,接下来我们分别来看。kvc28资讯网——每日最新资讯28at.com

1.粘包问题

粘包问题是指在网络通信中,发送方连续发送的多个小数据包被接收方一次性接收的现象。这可能是因为底层传输层协议(如 TCP)会将多个小数据包合并成一个大的数据块进行传输,导致接收方在接收数据时一次性接收了多个数据包,造成粘连。kvc28资讯网——每日最新资讯28at.com

例如以下案例,正常情况下客户端发送了两条消息,分别为“ABC”和“DEF”,那么接收端也应该收到两条消息“ABC”和“DEF”才对,但是接收端却收到了“ABCD”这样的消息,这种情况就叫做粘包,如下图所示:kvc28资讯网——每日最新资讯28at.com

kvc28资讯网——每日最新资讯28at.com

2.拆包/半包问题

拆包问题是指发送方发送的一个大数据包被接收方拆分成多个小数据包进行接收的现象。这可能是因为底层传输层协议(如 TCP)将一个大数据包拆分成多个小的数据块进行传输,导致接收方在接收数据时分别接收了多个小数据包,造成拆开。kvc28资讯网——每日最新资讯28at.com

例如以下案例,客户端发送了一条消息“ABC”,而接收端却收到了“AB”和“C”两条信息,这种情况就叫做半包,如下图所示:kvc28资讯网——每日最新资讯28at.com

kvc28资讯网——每日最新资讯28at.com

kvc28资讯网——每日最新资讯28at.com

PS:大部分情况下我们都把粘包问题和拆包问题看成同一个问题,所以下文就用粘包问题来替代粘包和拆包问题。kvc28资讯网——每日最新资讯28at.com

3.为什么会有粘包问题?

粘包问题通常发生在 TCP/IP 协议中,因为 TCP 是面向连接的传输协议,它是以“流”的形式传输数据的,而“流”数据是没有明确的开始和结尾边界的,所以就会出现粘包问题。kvc28资讯网——每日最新资讯28at.com

4.常见解决方案

粘包问题的常见解决方案有以下 3 种:kvc28资讯网——每日最新资讯28at.com

  • 固定大小方法:发送方和接收方固定发送数据大小,当字符长度不够时用空字符弥补,有了固定大小之后就知道每条消息的具体边界了,这样就没有粘包的问题了。
  • 自定义数据协议(定义数据长度):在 TCP 协议的基础上封装一层自定义数据协议,在自定义数据协议中,包含数据头(存储数据的大小)和 数据的具体内容,这样服务端得到数据之后,通过解析数据头就可以知道数据的具体长度了,也就没有粘包的问题了。
  • 特殊分割符:以特殊的字符结尾,比如以“/n”结尾,这样我们就知道数据的具体边界了,从而避免了粘包问题。

以上三种方案中,第一种固定大小的方法可能会造成网络流量的浪费,以及传输性能慢的问题;第二种解决方案实现难度大,且不利于维护,所以比较推荐的是第三种方案,使用特殊分隔符来区分消息的边界,从而避免粘包问题。kvc28资讯网——每日最新资讯28at.com

5.Netty解决方案

Netty 解决方案也延续了上面的常见解决方案,它的解决方案有以下几个:kvc28资讯网——每日最新资讯28at.com

  • 使用定长解码器(FixedLengthFrameDecoder):每个数据包都拥有固定的长度,接收端根据固定长度对数据进行切分,从而解决了粘包问题。
  • 使用行分隔符解码器(LineBasedFrameDecoder):以行为单位进行数据包的解码,从而解决粘包问题。
  • 使用分隔符解码器(DelimiterBasedFrameDecoder):使用特定的分隔符来标识消息边界,这样接收端可以根据分隔符正确切分消息。
  • 使用长度字段解码器(LengthFieldBasedFrameDecoder):在消息头部加入表示消息长度的字段,接收端根据长度字段来确定消息的边界,而从解决粘包问题。

kvc28资讯网——每日最新资讯28at.com

PS:在 Netty 中,解码器(Decoder)起着非常重要的作用。解码器主要负责将从网络中接收到的原始字节流数据转换为应用程序能够理解的 Java 对象或消息格式。使用解码器可以解决粘包和拆包问题、协议转换问题、消息编码(如文本转换为字节流)等问题。kvc28资讯网——每日最新资讯28at.com

这些解码器的使用如下。kvc28资讯网——每日最新资讯28at.com

(1)定长解码器

定长解码器(FixedLengthFrameDecoder)使用示例如下:kvc28资讯网——每日最新资讯28at.com

ChannelPipeline pipeline = ch.pipeline();// 假设每条消息长度为 5pipeline.addLast(new FixedLengthFrameDecoder(5)); pipeline.addLast(new StringDecoder());pipeline.addLast(new YourBusinessLogicHandler());

(2)行分隔符解码器

行分隔符解码器(LineBasedFrameDecoder)使用示例如下:kvc28资讯网——每日最新资讯28at.com

ChannelPipeline pipeline = ch.pipeline();// 设置行分隔符解码器最大(帧)长度为 8192 字节pipeline.addLast(new LineBasedFrameDecoder(8192)); pipeline.addLast(new StringDecoder()); // 添加字符串解码器pipeline.addLast(new SimpleChannelInboundHandler<String>() {    @Override    protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {        System.out.println("接收到消息:" + msg);    }});

(3)分隔符解码器

分隔符解码器(DelimiterBasedFrameDecoder)使用示例如下:kvc28资讯网——每日最新资讯28at.com

ChannelPipeline pipeline = ch.pipeline();// 使用 /r/n 来进行分隔ByteBuf delimiter = Unpooled.copiedBuffer("/r/n".getBytes());pipeline.addLast(new DelimiterBasedFrameDecoder(1024, delimiter));pipeline.addLast(new StringDecoder());pipeline.addLast(new YourBusinessLogicHandler());

(4)长度字段解码器

长度字段解码器(LengthFieldBasedFrameDecoder)使用示例如下:kvc28资讯网——每日最新资讯28at.com

ChannelPipeline pipeline = ch.pipeline();// 设置最大帧长度为 1024 字节,长度字段位于第 0 个字节,长度字段占用 4 个字节pipeline.addLast(new LengthFieldBasedFrameDecoder(1024, 0, 4, 0, 4));pipeline.addLast(new LengthFieldPrepender(4));pipeline.addLast(new StringDecoder());pipeline.addLast(new StringEncoder());pipeline.addLast(new LengthFieldServerHandler());

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-92177-0.html拼多多面试:Netty如何解决粘包问题?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 项目亮点:分析与解决小程序页面切换过程卡顿的问题

下一篇: 我们如何停止使用 Git Rebase

标签:
  • 热门焦点
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 十个可以手动编写的 JavaScript 数组 API

    十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 如何正确使用:Has和:Nth-Last-Child

    如何正确使用:Has和:Nth-Last-Child

    我们可以用CSS检查,以了解一组元素的数量是否小于或等于一个数字。例如,一个拥有三个或更多子项的grid。你可能会想,为什么需要这样做呢?在某些情况下,一个组件或一个布局可能会
  • 三万字盘点 Spring 九大核心基础功能

    三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库开发进阶,教你实现屏幕共享和多路复用!

    WebRTC.Net库:让你的应用更亲民友好,实现视频通话无痛接入! 除了基本用法外,还有一些进阶用法可以更好地利用该库。自定义 STUN/TURN 服务器配置WebRTC.Net 默认使用 Google 的
  • Temu起诉SHEIN,跨境电商战事升级

    Temu起诉SHEIN,跨境电商战事升级

    来源 | 伯虎财经(bohuFN)作者 | 陈平安日前据外媒报道,拼多多旗下跨境电商平台Temu正对竞争对手SHEIN提起新诉讼,诉状称Shein&ldquo;利用市场支配力量强迫服装厂商与之签订独家
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 由于成本持续增加,笔记本产品价格预计将明显上涨

    由于成本持续增加,笔记本产品价格预计将明显上涨

    根据知情人士透露,由于材料、物流等成本持续增加,笔记本产品价格预计将在2021年下半年有明显上涨。进入6月下旬以来,全球半导体芯片缺货情况加剧,显卡、处理器
  • 上海举办人工智能大会活动,建设人工智能新高地

    上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top
Baidu
map