首页 > 其他分享 >粘包和分包

粘包和分包

时间:2024-07-19 09:53:20浏览次数:6  
标签:字节 粘包 发送 hi 分包 接收

了解粘包和分包的问题为什么会存在? 粘包和分包是利用socket在TCP协议下内部的优化机制。是它内部的一个传输机制导致的。 粘包:多条数据包之间粘在一起变成一个包。(因为发送消息比较频繁;每个包的消息很小;TCP想解决频繁发送造成浪费的性能问题)⚠️服务器端接收的消息可能不是一条,可能是多条组合成的一条。 分包:一个很长的包在传输中分成了多条数据包(因为数据量很大;如果发送失败的话需要重新发送很占用时间;大包比较占用网速,运速会比较慢)⚠️如果说一个包被分成了10次,那服务器端会调用10次接收方法,Receive接收到的消息是分割了的数据。 演示一个从客户端向服务器端发送消息粘包分包的情况。 1.粘包

//客户端--粘包问题
using System.Net.Sockets;
void Start()
{
    for(int i=0;i<=100;i++)
    {
        //只把数据发送到服务器端,如果这里有很频繁的消息发送数据量又很小,这个时候它会出现粘包的问题,客户端发送100次服务器端就会接收100次输出100次数据,那么看它实际输出次数为10次。   
        clientSocket.Send(Encoding.UTF8.GetBytes(i.ToString()));
    }
}
包虽然会粘在一起,但是到达的先后顺序是不会变的。

2.分包 分包问题不在于发送的有多快,而在于一个包有多大。
//客户端--分包问题
using System.Net.Sockets;
string msg=@"打哈鬼谷够阿荣黄瓜啊uu很尬人hi阿法hi哈偶覅潍坊hi啊u反反复复个会阿嘎hi胡帕覅u噶恒瑞i哦爬爬服荣黄瓜啊哈会阿法hi哈偶覅潍坊hi啊u反反复复个会阿嘎hi胡帕覅u噶";
clientSocket.Send(Encoding.UTF8.GetBytes(msg));

即使接收数组给的足够大,只要数据够大,也会分包。

clientSocket.BeginReceive(dataBuffer,0,102400,SocketFlags.None,ReceiveCallback,clientSocket);
static byte[] dataBuffer=new byte[102400];

 处理粘包分包问题?

在接收到的字节消息数组(byte[])前+接收数据长度(整型),读取数据长度的字节。 字节消息数组的长度是不固定的,但是数据长度得时固定的。如果数据长度也不固定,那我们根本不知道接收到的这个消息占用多少字节。 如果读取到的数据不够长就先不处理等下次再接收到之后再判断是否够长。

 

 

 

 

 

 

 

 

 

 

 

 

标签:字节,粘包,发送,hi,分包,接收
From: https://www.cnblogs.com/siki2017/p/18310842

相关文章

  • 计算机网络 TCP粘包问题
    什么是粘包?粘包是指的是数据和数据之间没有没有明确的分界线,导致不能够正确的传输数据(只有TCP会粘包UDP永远不会粘包),粘包问题只针对于一切字节流的协议。TCP也可以称为流式协议,UDP称为数据报式协议。对于流式协议:发送端可以1K1K的发送数据,接收端可以2k2k的提取数据,也可以......
  • uniapp 封装蓝牙-(给设备发指令,分包数据发送)
    注意事项:1、关键点:初始化蓝牙——》uni.openBluetoothAdapter获取本机蓝牙适配器状态——》uni.getBluetoothAdapterState开始搜索蓝牙设备——》uni.startBluetoothDevicesDiscovery监听蓝牙设备(或者蓝牙设备列表,找到需要的那个)——......
  • 粘包问题、socketserver模块实现并发
    TCP协议------------黏包现象11.服务端连续执行三次recv22.客户端连续执行三次send3问题:服务端一次性接收到了客户端三次的消息该现象称为"黏包现象"4--------------------------------------5黏包现象产生的原因:61.收消息的时候,不知道每次接收的数据到......
  • Tcp粘包半包问题(现实场景举例帮助理解)
    理解粘包问题时,我们可以将这个过程想象得更加生活化一些。想象你正在经营一家水果拼装店,你的任务是接收来自不同客户的水果订单,并将这些水果按照订单要求重新组装起来。每份订单中的水果都事先被切成了便于快递的“水果片”,并通过同一条传送带送过来。现在,你收到了两份订单,一......
  • 【Socket】解决TCP粘包问题
    一、介绍TCP一种面向连接的、可靠的、基于字节流的传输层协议。三次握手:客户端发送服务端连接请求,等待服务端的回复。服务端收到请求,服务端回复客户端,可以建立连接,并等待。客户端收到回复并发送,确认连接。服务端收到回复。连接成功。四次挥手:与三次握手不同,客户端和服务......
  • uni-app项目分包后子包中静态资源丢失
    前情uni-app是我比较喜欢的跨平台框架,它能开发小程序/H5/APP(安卓/iOS),重要的是对前端开发友好,自带的IDE让开发体验非常棒,公司项目就是主推uni-app。坑位随着项目越做越大,发现小程序的包体积已经超过了小程序单包最高2M的限制,于是对项目进行了分包处理,在分包过种中真正占项目体......
  • 拼多多面试:Netty如何解决粘包问题?
    粘包和拆包问题也叫做粘包和半包问题,它是指在数据传输时,接收方未能正常读取到一条完整数据的情况(只读取了部分数据,或多读取到了另一条数据的情况)就叫做粘包或拆包问题。从严格意义上来说,粘包问题和拆包问题属于两个不同的问题,接下来我们分别来看。1.粘包问题粘包问题是指在网络......
  • 粘包问题
    【一】什么是粘包只有TCP有粘包现象,UDP永远不会粘包【1】TCPTCP(transportcontrolprotocol,传输控制协议)是面向连接的,面向流的,提供高可靠性服务。收发两端(客户端和服务器端)都要有一一成对的socket因此,发送端为了将多个发往接收端的包,更有效的发到对方,使用了优化方法(Nagle......
  • C++ - TCP粘包解决方法
     下面的代码演示了粘包问题,客户端连续三次向服务器端发送数据,服务器端却一次性接收到所有数据。服务器代码#define_WINSOCK_DEPRECATED_NO_WARNINGS#include<iostream>usingnamespacestd;//#include<stdio.h>#include<WinSock2.h>​//#pragmacomment(lib,"ws2_......
  • 三次握手和四次挥手、UDP、TCP、粘包问题、模块回顾
    【一】三次握手和四次挥手【1】TCP协议的三次握手和四次挥手TCP协议位于osi七层协议中的传输层(1)使用三次握手来建立连接一次握手:客户端发送带有SYN(SEQ=x)标志的数据包---》服务端,然后客户端进入SYN_SEND状态,等待服务器的确认。二次握手:服务端发送带有SYN+A......