什么是粘包和半包问题

news2024/12/22 18:04:26

什么是粘包和半包问题

粘包
发送的是 ABC和DEF
接收到的是 ABCDEF
半包
发送的是 ABCD
接收到的是 AB 和 CD

为什么会有粘包问题?

因为 TCP 是面向连接的传输协议,它是以“流”的形式传输数据的,而“流”数据是没有明确的开始和结尾边界的,所以就会出现粘包问题

粘包问题代码演示

服务器端用来接收消息,

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
服务器端:接收信息
 */

class ServSocket {
    private static final int BYTE_LENGTH = 20;
    public static void main(String[] args) throws IOException {
        ServerSocket servSocket = new ServerSocket(8888);
        Socket clienSocket = servSocket.accept();
        try (InputStream inputStream = clienSocket.getInputStream()) {
            while (true) {
                byte[] bytes = new byte[BYTE_LENGTH];
                int count = inputStream.read(bytes,0,BYTE_LENGTH);
                if (count > 0) {
                    System.out.println("服务器接收的信息是:"  + new String(bytes));
                }
            }
        }
    }
}

/*
客户端:发送信息
 */

class ClientSocket {
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        final String message = "Hi,student";
        try (OutputStream outputStream = socket.getOutputStream()) {
            for (int i = 0; i < 10; i++) {
                outputStream.write(message.getBytes());
            }
        }
    }
}

在这里插入图片描述
通过上述结果我们可以看出,服务器端发生了粘包问题,

解决方案

粘包问题的常见解决方案有以下 3 种:

  1. 固定大小: 发送方和接收方固定发送数据的大小,当字符长度不够时用空字符弥补,有了固定大小之后就知道每条消息的具体边界了,这样就没有粘包的问题了
  2. 自定义协议:在TC 协议的基础上封装一层自定义数据协议,在自定义数据协议中,包含数据2头(存储数据的大小)和 数据的具体内容,这样服务端得到数据之后,通过解析数据头就可以知道数据的具体长度了,也就没有粘包的问题了
  3. 以特殊的字符结尾:比如以“”结尾,这样我们就知道数据的具体边界了,从而避免了粘包问题 (推荐方案)

解决方案1:固定数据大小

优缺点分析
从以上代码可以看出,虽然这种方式可以解决粘包问题,但这种固定数据大小的传输方式,当数据量比较小时会使用空字符来填充,所以会额外的增加网络传输的负担,因此不是理想的解决方案。

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
/*
服务器端:接收信息
 */

class ServSocket {
    private static final int BYTE_LENGTH = 1024;
    public static void main(String[] args) throws IOException {
        ServerSocket servSocket = new ServerSocket(8888);
        Socket clienSocket = servSocket.accept();
        try (InputStream inputStream = clienSocket.getInputStream()) {
            while (true) {
                byte[] bytes = new byte[BYTE_LENGTH];
                int count = inputStream.read(bytes,0,BYTE_LENGTH);
                if (count > 0) {
                    System.out.println("服务器接收的信息是:"  + new String(bytes));
                }
            }
        }
    }
}

/*
客户端:发送信息
 */

class ClientSocket {
    private static final int BYTE_LENGTH = 1024;
    public static void main(String[] args) throws IOException {
        Socket socket = new Socket("127.0.0.1",8888);
        final String message = "Hi,student";
        try (OutputStream outputStream = socket.getOutputStream()) {
            byte[] bytes = new byte[BYTE_LENGTH];
            int idx = 0;
            for (byte b : message.getBytes()) {
                bytes[idx] = b;
                idx++;
            }
            for (int i = 0; i < 10; i++) {
                outputStream.write(bytes,0,BYTE_LENGTH);
            }
        }
    }
}

剩下的两个方法可以百度

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1099013.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MIT6.5830 Lab1-Go tutorial实验记录(一

MIT6.5830 Lab1-Go tutorial实验记录&#xff08;一&#xff09; – WhiteNights Site 标签&#xff1a;Golang, 数据库 编写一个简单的http server。 前言 MIT数据库系统实验 在网上看到了这么个实验&#xff0c;刚好对golang和数据库比较感兴趣&#xff0c;于是开始跟着做实…

五大亮点探索互联网医院源码的创新应用方式

作为互联网医疗行业的专家&#xff0c;我将为您揭示互联网医院源码的五大创新亮点。随着数字化技术的迅猛发展&#xff0c;互联网医院源码成为了提升医疗服务质量和提供便捷就医体验的重要工具。现在&#xff0c;让我们一起深入探索这五大亮点&#xff0c;了解互联网医院源码在…

什么是人事RPA?人事RPA解决什么问题?人事RPA实施难点在哪里?

每家公司人力资源部门每天需要筛选适合自己公司岗位要求的人才并与之沟通邀约面试、每月全公司员工的考勤状态核对、业绩考核核对、入离职手续办理、新员工培训等等&#xff0c;每项业务流程都由人手操作&#xff0c;效率极低、流程繁琐、费时费力。HR部门每天面对的业务数据量…

基于Java的驾校教练预约管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

使用Linux远程连接OpenGauss数据库的步骤和方法

文章目录 前言1. Linux 安装 openGauss2. Linux 安装cpolar3. 创建openGauss主节点端口号公网地址4. 远程连接openGauss5. 固定连接TCP公网地址6. 固定地址连接测试 前言 openGauss是一款开源关系型数据库管理系统&#xff0c;采用木兰宽松许可证v2发行。openGauss内核深度融合…

COMMUTING CONDITIONAL GANS FOR MULTI-MODAL FUSION

方法 C f ^f f是分类器&#xff0c;P f ^f f(o i _i i​)是第i个物体出现的融合概率 作者未公布代码

Sectigo数字证书

安装SSL证书可以提供数据保护、确保身份真实性&#xff0c;并增强用户信任&#xff0c;从而提高网站的安全性和可信度。所以越来越多注重网络安全的技术人员在保障数据安全的手段上&#xff0c;选择直接安装SSL证书。 其中Sectigo的SSL证书是全球SSL证书市场占有率最高的CA公司…

电脑打开图片比例太大怎么调?这个方法又快又好用

别人给我们发送的图片&#xff0c;有许多打开之后提示图片太大&#xff0c;这种情况改怎么处理呢&#xff1f;其实可以使用图片改大小&#xff08;https://www.yasuotu.com/size&#xff09;功能来对图片尺寸大小修改就可以了&#xff0c;接下来就分享一个批量修改图片尺寸的方…

牛奶配送经营商城小程序的作用是什么

牛奶是老少皆爱喝的饮品&#xff0c;市场呈现大品牌多区域拓展形式&#xff0c;中小企业在经营中较为受限制&#xff0c;传统线下超市铺货占领的方式已经变得很低效&#xff0c;线下直营店和经销商在实际经营中面临难题。 线下经营受困&#xff0c;线上经营成为众商家扩大生意…

01_CookieWebStorage

1 Cookie Cookie的使用必须基于web服务器&#xff0c;因为Cookie的操作会跟随http请求进行。 Cookie&#xff0c;有时也用其复数形式 Cookies。类型为“小型文本文件”&#xff0c;是某些网站为了辨别用户身份&#xff0c;进行Session跟踪而储存在用户本地终端上的数据&#x…

水生物数据集

FishNet: A Large-scale Dataset and Benchmark for Fish Recognition, Detection, and Functional Traits Prediction FishNet 是一个大规模多样化的数据集&#xff0c;包含了来自 17357 种水生物的 94532 张精心整理的图像。这些图像根据水生物的生物分类学&#xff08;目、科…

数据挖掘之贝叶斯优化——前反馈特征的参数,估计特征的最佳数值

贝叶斯优化是一个全局优化方法&#xff0c;用于优化具有噪声的黑盒函数。这一方法在许多现实世界的问题中都有应用&#xff0c;特别是在那些评估目标函数的代价很高的场合&#xff0c;例如超参数调优。 背景&#xff1a; 为什么需要贝叶斯优化&#xff1f; 在数据挖掘、机器…

VBA窗体跟随活动单元格【简易版】

本篇博客与以往的风格不同&#xff0c;先上图再讲解。 这个效果是不是很酷&#xff0c;VBA窗体&#xff08;即UserForm&#xff0c;下文中简称为窗体&#xff09;可以实现很多功能&#xff0c;例如&#xff1a;用户输入数据&#xff0c;提供选项等等。如本博客标题标注&#…

分享一下微信小程序怎么实现积分商城功能

微信小程序是一种便捷、高效的应用程序&#xff0c;它可以帮助企业或商家快速搭建自己的线上平台&#xff0c;提供更好的服务和产品给用户。积分商城是小程序中一种常见的功能&#xff0c;它可以帮助企业或商家吸引和留住用户&#xff0c;提高用户的忠诚度和互动性。下面就以微…

苹果 Vision Pro 头显新专利:增加重量减轻颈部压力

上周&#xff0c;彭博社的古尔曼表示 Vision Pro 头显过重&#xff0c;导致开发者佩戴后出现明显的颈部疲劳。随后&#xff0c;便有人发现在美国商标和专利局&#xff08;USPTO&#xff09;公示的清单中&#xff0c;苹果公司又获得了一项Vision Pro的专利&#xff0c;该专利提…

【Linux学习笔记】下载工具yum

1. yum工具1.1. yum的安装1.2. yum的搜索1.3. yum的卸载 2. Linux和Windows互相传输文件2.1. rz命令2.2. sz命令 3. yum的下载源 1. yum工具 yum是Linux软件包的管理器&#xff0c;是一个软件。那么软件的本质是什么呢&#xff1f; 答案是指令&#xff01; 下面举几个简单的例…

如何管理消极怠工的员工?

消极怠工是指员工在工作中表现出缺乏积极性和主动性&#xff0c;对工作任务不负责任或者敷衍了事的行为。这种行为不仅影响了员工个人的工作效率和职业发展&#xff0c;也会对整个团队的工作氛围和效率产生负面影响。因此&#xff0c;如何管理消极怠工的员工成为了管理者需要面…

OA系统和ERP系统有什么区别?

在当今的企业管理领域&#xff0c;协同办公管理系统和ERP系统是两个非常重要的工具。它们在企业的日常运营中扮演着不同的角色&#xff0c;有着各自独特的功能和优势。那么&#xff0c;OA系统和ERP系统到底有什么区别呢&#xff1f;协同办公管理系统又是如何在这两者之间发挥协…

【Python应用】S02 将元组、序列分解为单独的变量

分解已知元素数量的元组、序列 e . g . 1 e.g.1 e.g.1 分解包含 N N N 个元素的元组或序列为 N N N 个单独的变量。 p (4, 5) x, y pe . g . 2 e.g.2 e.g.2 data [ACME, 50, 91.1, (2012, 12, 21)] name, shares, price, date datae . g . 3 e.g.3 e.g.3 data [ACME,…

重生奇迹mu游戏有哪些职业?

作为一款经典的网络游戏&#xff0c;重生奇迹MU一直是佼佼者&#xff0c;各方面设计非常出色&#xff0c;在玩家们的评价中也是不错&#xff0c;让玩家非常喜欢这款游戏了。 在这款游戏中有许多职业&#xff0c;必须要注意每个职业都有存在的价值&#xff0c;每个职业都有自己…