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

粘包问题怎么解决_包带粘手怎么处理如何解决粘包问题粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于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字节,所以对端先收取包头大小的字节内容,然后解析包头,根据包头中指定的包体大小收取包体,等包体收够了,就组装成一个完整的包来处理。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Action Bar_pull the bar

    Action Bar_pull the barAction Bar 的相关操作

  • useGeneratedKeys属性

    useGeneratedKeys属性Springboot中Mybatis配置文件Mapper参数useGeneratedKeys=“true”keyProperty=“id”useGeneratedKeys设置为true时,表示如果插入的表id以自增列为主键,则允许JDBC支持自动生成主键,并可将自动生成的主键id返回…

  • IntelliJ IDEA安装操作步骤

    IntelliJ IDEA安装操作步骤一、下载安装1、打开官网:http://www.jetbrains.com/idea/,点击页面中的“DOWNLOAD”2、根据自己的需要选择下载的IntelliJIDEA版本,此处我的电脑是Windows764位的,我选择的是Community(社区版)3、双击下载好的安装包4、点击“Next”5、选择安装位置,然后点击“Next”6、勾选安装选型,然后点击“Next…

  • 半年从转行软件测试到产品经理

    背景介绍本人一个普通二本,浪费了四年时间,毕业年龄就比同学大几岁,输在起跑线上,最可悲的是第一份工作也是随大流,完全放弃了自己的专业,什么东西也没学到,关键这一呆就是三年,浑浑噩噩过日子,根本不清楚自己的方向在哪里,想要什么样的生活!刚毕业自己就背负房贷,一个月3000多的工资,过的就是中国最底层的生活,就这样我忍耐了三年,女朋友作为其他公司的HR实在看不下自己的生活方

  • cocos creator 部署微信云开发

    cocos creator 部署微信云开发cocoscreator部署微信云开发

    2022年10月26日
  • 用导数的定义求指数函数的导数_对数函数导数的推导

    用导数的定义求指数函数的导数_对数函数导数的推导指数函数的性质  先来复习一下中学的课程:指数函数的导数  对f(x)=ax求导:  ax右侧的那个极限似乎没有办法继续简化了,如果这个极限看作关于a的函数(之所以将极限看作关于a的函数,是因为在这个极限中,a是未知的,Δx是已知的):  函数在某一点导数的几何意义是该点处切线的斜率,所以M(a)也就是ax在x=0处切线的斜率。  如果y=2x,…

    2022年10月24日

发表回复

您的电子邮箱地址不会被公开。

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