网络基础- Socket 通讯中粘包处理

ops/2024/9/25 21:23:49/

      Java 传统的 Socket 编程分为两种实现方式,这两种实现方式也对应着两种不同的传输层协议:TCP 协议和 UDP 协议,但作为互联网中最常用的传输层协议 TCP,在使用时却会导致粘包和半包问题。

 什么是粘包?

什么是半粘包?

什么情况下出现粘包问题?

        在socket编程中程序的读写数据需求在图中 socket buffer中操作,粘包问题就出现在 socket buffer 中,程序在发送报文数据时可能存在连续情况。当socket buffer满了会进行自动flush 接受报文数据方就可能出现粘包或半年包问题。

flush操作就是将报文数据从 socket buffer 通过网卡发送给接收方。

粘包问题

        当报文数据小于socket buffer时,socket 不会进行flush。再次向socket buffer添加报文数据,此时报文数据并未添加完成socket buffer满了进行了发送。

接收方读取套接字(Socket)缓冲区数据不够及时。

半粘包问题

        当报文数据大于socket buffer时,此时报文数据并未添加完成socket buffer满了进行了发送。

怎么解决粘包方案?

1、发送方和接收方规定固定大小的缓冲区,也就是发送和接收都使用固定大小的
       byte[] 数组长度,当字符长度不够时使用空字符弥补;
2、在 TCP 协议的基础上封装一层数据请求协议,既将数据包封装成数据头
   (存储数据正文大小)    + 数据正文的形式,这样在服务端就可以知道每个数据包的具体长度           了,知道了发送数据的具体边界之后,就可以解决半包和粘包的问题了;
3、以特殊的字符结尾,比如以“\n”结尾,这样我们就知道结束字符,从而避免了半包和粘包问题       (推荐解决方案)。

参考:关于Socket 客户端和服务端通信,为什么要flush 为什么使用shutdownOutput的问题_socket flush-CSDN博客


http://www.ppmy.cn/ops/2863.html

相关文章

npm ERR! code CERT_HAS_EXPIREDnpm ERR! errno CERT_HAS_EXPIRED

解决npm ERR! code CERT_HAS_EXPIRED npm ERR! errno CERT_HAS_EXPIRED npm ERR! request to 分析过后这个问题是证书过期的意思 考虑到其他的原因 这里给出三个解决方案 一: 清除npm缓存 npm cache clean --force 取消ssl验证: npm config set strict-…

woordpress 个人博客搭建一键部署

woordpress 个人博客搭建 yum -y install git && git clone https://gitee.com/Saddhu/wordpress.git && bash wordpress/install_wordpress.shWordPress是一个以PHP和MySQL为平台的自由开源的博客软件和内容管理系统[6]。WordPress具有插件架构和模板系统。截…

【AcWing】蓝桥杯集训每日一题Day27|矩阵乘法|快速幂|205.斐波那契(C++)

205.斐波那契 205. 斐波那契 - AcWing题库难度:中等时/空限制:1s / 64MB总通过数:3220总尝试数:4747来源:《算法竞赛进阶指南》算法标签数学知识矩阵乘法快速幂 题目内容 在斐波那契数列中, F i b 0 0 …

【创建型模式】工厂方法模式

一、简单工厂模式 1.1 简单工厂模式概述 简单工厂模式又叫做静态工厂方法模式。 目的:定义一个用于创建对象的接口。实质:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。 简单工厂模式…

ChatGPT写作术:高效撰写顶级论文

ChatGPT无限次数:点击直达 ChatGPT写作术:高效撰写顶级论文 在当今信息爆炸的时代,如何撰写出高质量的论文成为许多研究者和学生的重要课题。借助人工智能技术的不断发展,像ChatGPT这样的语言生成模型能够为撰写论文提供有效的帮助。本文将介…

云原生(八)、Kubernetes基础(一)

K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间,以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…

外包干了2个月,技术倒退2年。。。

先说一下自己的情况,本科生,20年通过校招进入深圳某软件公司,干了接近4年的功能测试,今年国庆,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

Sql Server 数据库:查询表结构脚本

查询脚本: SELECT CASE WHEN col.colorder 1 THEN obj.name ELSE END AS 表名, col.colorder AS 序号 , col.name AS 列名 , ISNULL(ep.[value], ) AS 列说明 , t.name AS 数据类型 , col.length AS 长度 , ISNULL(COLUMNPROPERTY(col.id, col.name, Scale), 0) AS 小数位数…