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

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


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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mysql 字符串转数字类型

    Mysql 字符串转数字类型MySQL字符串的‘123’转换为数字的123方法一:SELECTCAST(‘123’ASSIGNED);方法二:SELECTCONVERT(‘123’,SIGNED);方法三:SELECT’123’+0;参考:https://www.cnblogs.com/emanlee/p/5998683.html…

    2022年5月7日
  • 土法炼钢_百度百科[通俗易懂]

    土法炼钢_百度百科[通俗易懂]土法炼钢_百度百科土法炼钢

    2022年8月5日
  • PyCharm插件安装「建议收藏」

    PyCharm插件安装「建议收藏」PyCharm插件安装环境:PyCharm2018.2.2(ProfessionalEdition)Windows101、查看电脑Pycharm版本:【help】->【about】查看pycharm版本2、pycharm插件搜索并安装:【file】->【settings】->【Plugins】进入插件导览界面;点击【BrowseJetBrain…

    2022年6月24日
  • layui vue 在一起用的坑 select

    layui vue 在一起用的坑 select问题是这样的,<divclass=”layui-btn-group”><buttonclass=”layui-btn”@click=”businessChange(‘bc01′)”:class=”business==’bc01′?’layui-btn-normal’:’layui-btn-primary’…

    2022年6月25日
  • JS文本操作 Scripting.FileSystemObject

    JS文本操作 Scripting.FileSystemObjectScripting.FileSystemObject方法或者属性描述BuildPath()生成一个文件路径CopyFile()复制文件CopyFolder()复制目录CreateFolder()创建新目录CreateTextFile()生成一个文件DeleteFile()删除一个文件DeleteFolder()删

    2022年7月14日
  • c程序中整形变量只能存放整数实型变量只能存放浮点数_c语言合法的实型常量

    c程序中整形变量只能存放整数实型变量只能存放浮点数_c语言合法的实型常量vb中,以下变量类型1,数字型变量(numeric)2,字符串型变量(string)3,日期型变量(date)4,对象型变量(object)5,变体型变量(variant)这几个vb变量类型中,最最主要的就是前面两个,数字型变量和字符串型变量.意思很简单,数字型可以用来存放数字,字符串型存放文本.下面就来详细介绍这几种变量.1.数字型数字型变量有多种类型,在咱们的vb里,有3中数字数据类型1;整形…

    2022年10月26日

发表回复

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

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