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

粘包问题怎么解决_包带粘手怎么处理如何解决粘包问题粘包就是连续向对端发送两个或者两个以上的数据包,对端在一次收取中受到的数据包数量可能大于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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hibernate与mybatis的区别比较_mybatis中

    hibernate与mybatis的区别比较_mybatis中为方便以后准备面试,把一些常用的技术整理出来,会不定期更新。首先简单介绍下两者的概念:Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装。Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系。下面具体从几个方面说一下两者的区别:1.两者最大的区

    2025年10月20日
    3
  • 一个简单的Parallel.ForEach实现

    一个简单的Parallel.ForEach实现在.net的TaskParallelLibrary中有一个很方便的功能Parallel.ForEach,可以实现多任务的并发执行,另外还带着栅栏功能,非常好用。但是这一功能必须需要clr4.0支持(CTP版的不大好用),对于低版本的.net要实现类似功能只有自己写一个了。codeproject上面文章PoorMan’sParallel.ForEachIterator中就有一种简单而…

    2022年7月19日
    9
  • Java课程设计—学生成绩管理系统(201521123004-林艺如)「建议收藏」

    Java课程设计—学生成绩管理系统(201521123004-林艺如)「建议收藏」1.团队课程设计博客"团队课程设计博客链接"2.个人负责模块或任务说明①.MenuMenu.jsp在页面中给出提示,用HTML的,与下一个跳转页面进行连接,即点击后进入下

    2022年6月30日
    29
  • 简单的关机程序(C语言)

    简单的关机程序(C语言)Windows系统自带一个名为Shutdown.exe的程序,可以用于关机操作(位置在Windows\System32下),一般情况下Windows系统的关机都可以通过调用程序shutdown.exe来实现的,同时该程序也可以用于终止正在计划中的关机操作。while循环实现:#include<stdio.h>#include<stdlib.h>intmain(){ charinput[20]={0}; system(“showdown-s-t60.

    2022年7月22日
    14
  • php开发工程师面试题知识点总结(三)–中级篇

    php开发工程师面试题知识点总结(三)–中级篇

    2022年2月12日
    38
  • Windows批处理(.bat)常用命令教程

    Windows批处理(.bat)常用命令教程批处理的语句不多,但是在某些时候,结合常用的一些cmd命令,可以解决很多重复性的工作。下面是一些对批处理命令的总结,如果需要学习的话,对这些关键字有个印象就可以了,如果忘记怎么用,可以使用关键字/?来获取帮助,帮助内容都是中文,很容易理解,比如:常见问题:(1).bat输出中文乱码:把文本格式改成ANSI(2)双击bat文件,直接闪退:在代码最后一行加上pause,相当于C语言中的getchar(),让页面执行完之后不要关闭。1echo和@回显命令@#关闭单行回显echooff

    2022年8月22日
    10

发表回复

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

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