粘包问题怎么解决_包带粘手怎么处理

粘包问题怎么解决_包带粘手怎么处理如何解决粘包问题粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于1个,当大于1个时,可能时几个包加上某个包的部分,这这干脆几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫做半包。无论是半包问题还是粘包问题,因为TCP是流式数据,所以其解决思路还是从收到的数据中把包与包的边界区分出来。如何区分,有以下三种办法。固定包长的数据包。固定包长,即每个协议包的长度都是固定的。假如我们规定每个协议包的大小都是64字节,每收满64字节,就取出来

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

如何解决粘包问题

粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于1个,当大于1个时,可能时几个包加上某个包的部分,这这干脆几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫做半包。

在这里插入图片描述

无论是半包问题还是粘包问题,因为TCP是流式数据,所以其解决思路还是从收到的数据中把包与包的边界区分出来。如何区分,有以下三种办法。

  1. 固定包长的数据包。固定包长,即每个协议包的长度都是固定的。假如我们规定每个协议包的大小都是64字节,每收满64字节,就取出来解析(如果不够,就先存起来),则这种通信协议的格式简单但灵活性太差。如果包的内容长度小于指定的字节数,对剩余的空间就需要填充特殊的信息,例如\0;如果包的内容超过指定的字节数,又得分包分片,则需要增加额外的处理逻辑——在发送端进行分包分片,在接收端重新组装。
  2. 以指定的字符串为包的结束标志。这种协议包比较常见,即在字节流中遇到特殊的符号值时就认为到一个包的末尾了。例如FTP或者SMTP,在一个命令或者一段数据后面加上\r\n表示一个包的结束。对端收到数据后,每遇到一个\r\n,就把之前的数据当作一个数据包。这种协议一般用于一些包含各种命令控制的应用中,其不足指出就是如果协议包的内容部分需要使用包结束标志字符,就需要对这些字符做转码或者转移操作,以免被接收方错误地当成包结束标志而误解析。
  3. 包头+包体格式,这种格式一般分为两部分,即包头和包体,包头是固定大小的,且包头必需包含一个字段来说明接下来的包体有多大。例如。
struct msg_header
{ 
   
	int32_t bodySize;
    int32_t cmd;
};

是一个典型的包头结构,bodySize指定了这个包的包体有多大。由于包头的大小是固定的,这是是8字节,所以对端先收取包头大小的字节内容,然后解析包头,根据包头中指定的包体大小收取包体,等包体收够了,就组装成一个完整的包来处理。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169713.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 三万字详解SpringClould高可用流量防护组件Sentinel哨兵(含源码例子)[通俗易懂]

    三万字详解SpringClould高可用流量防护组件Sentinel哨兵(含源码例子)[通俗易懂]文章目录一、断路器1.1.为什么使用断路器?1.2.断路器两大常用组件Sentinel和Hystrix对比二、sentinel主要特性三、sentinel两个部分、三步骤3.1.两部分3.2.三步骤四、使用核心库(如果已经引入了springcloudalibabajar不需要单独选择版本,只需直接引用)一、断路器1.1.为什么使用断路器?在微服务架构中,我们将系统拆分成了很多服务单元,各单元的应用间通过服务注册与订阅的方式互相依赖。由于每个单元都在不同的进程中运行,依赖通过远程

    2022年6月2日
    34
  • android 高德地图标记,android学习之高德地图添加标记

    android 高德地图标记,android学习之高德地图添加标记Marker用于标注地图上的一个特定位置aMap的.addMarker(markerOptions)方法即可markerOptions有如下的属性position(Required)在地图上标记位置的经纬度值。参数不能为空。title当用户点击标记,在信息窗口上显示的字符串。snippet附加文本,显示在标题下方。draggable如果您允许用户可以自由移动标记,设置为“true”。…

    2022年5月21日
    135
  • Haier数字可视对讲系列(转)「建议收藏」

    Haier数字可视对讲系列(转)「建议收藏」数字可视对讲系列楼宇可视对讲这一家庭安防设备是智能化小区建设的必要项目之一,也是家居安全的护身符。对讲系统是在各小区、单元门入口安装防盗门和对讲装置,其主要目的是实现访客与住户可视、对讲。住户可通过系统遥控开启防盗门,从而有效…

    2022年6月22日
    53
  • 将ipynb转化为pdf_jupyter打开ipynb文件

    将ipynb转化为pdf_jupyter打开ipynb文件将ipynb文件转换为markdownjupyternotebook文件(扩展:ipynb)转换说明转换jupyternotebook文件(扩展:ipynb)使用jupyternotebook转为为markdown文档文件。转换说明执行命名进行转化;文件名有空格推荐:“LinerR.ipynb”方式;LinerR.ipynb种诺是有图片,会自动保存至当前LinerR_f…

    2022年8月29日
    4
  • php匹配图片、视频文件、音乐文件的正则表达式

    php匹配图片、视频文件、音乐文件的正则表达式

    2021年9月21日
    49
  • 基于AX88796B的网络接口模块的设计与实现[通俗易懂]

    基于AX88796B的网络接口模块的设计与实现[通俗易懂] 基于AX88796B的网络接口模块的设计与实现[日期:2008-7-22]来源:今日电子/21IC 作者:重庆邮电大学崔巍[字体:大中小]  引言网络技术应用日益普及的今天,工业现场的仪器仪表、数据采集和控制设备也日趋网络化,工业自动化和网络的结合越来越密切。而将以太网和嵌入式系统相结合应用于工业控制中已成为趋势。AX8

    2022年6月10日
    33

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号