粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符'a',因为发送的速度很快,接收端可能一次就收到了10个字符'aaaaaaaaaa',这就是接收端的粘包。

  可能我们在平时练习时没觉的粘包有什么危害,或者通过把发送端发送的速率调慢来解决粘包,但在实时通信中,发送端常常是单片机或者其他系统的信息采集机,它们的发送速率是无法控制的,如果不解决接收端的粘包问题,我们无法获得正常的信息。

  就以我自己正在做的项目来说,接收端是一台单频指标测量仪,它会把当前测量的单频指标信息通过socket接口发送给服务器,发送包长度约100字节,1s能发送10个包左右,如果我不实时处理粘包,为前台就无法实时展示采集到的单频指标信息。

  下面演示的通信是在之前的框架基础上增加的一些代码,首先先创建一个包模拟类生成类PackageBuilder,它可以自动生成长度不一的包,用于测试发送,代码如下,因为与通信无关所以对里面的代码不做说明。

  public static class PackageBuilder
{
static StringBuilder package = new StringBuilder();
public static string[] BuildPackage(int count)
{
Random random = new Random();
int dataLength;
string[] packageArr = new string[count];
int myChar;
for (int j = ; j < count; j++)
{
dataLength = random.Next() + ;
package.Append("HEAD|H1|"+dataLength);
package.Append("data:");
for (int i = ; i < dataLength-; i++)
{
myChar = random.Next() + ; package.Append((char)myChar);
} packageArr[j] = package.ToString();
package.Clear();
} return packageArr; }

  在main函数中测试一下生成的包

static void Main(string[] args)
{ string[] str = PackageBuilder.BuildPackage();
for (int i = ; i < ; i++)
{ // str = PackageBuilder.BuildPackage();
Console.WriteLine(str[i]);
// Thread.Sleep(500);
} Console.Read(); }

解决粘包问题有多种方法,根据发送包的结构,我采取的是根据包数据长度分包的方法。

如上图所示,我们发送包结构为:包头+数据长度+数据,包头(HEAD|H1|)是固定长度,内容基本不变,数据长度(两个字节)是变化的,数据(data:+随机字符)也是变化的,其中数字之后的所有内容都是数据,包括'data:'。

前奏讲完了下篇文章回到socket。

Socket解决粘包问题1的更多相关文章

  1. c# socket 解决粘包,半包

    处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断 ...

  2. 网络编程基础【day09】:socket解决粘包问题之MD5(八)

    本节内容 1.概述 2.代码实现 一.概述 上一篇博客讲到的用MD5来校验还是用的之前解决粘包的方法,就是客户端发送一个请求,等待服务端的确认的这样的一个笨方法.下面我们用另外一种方法:就是客户端已经 ...

  3. Socket解决粘包问题2

    在AsynServer中对接收函数增加接收判断,如果收到客户端发送的请求信息,则发送10个测试包给发送端,否则继续接收,修改后的接收代码如下: private void AsynReceive() { ...

  4. Python开发【socket篇】解决粘包

    客户端 import os import json import struct import socket sk = socket.socket() sk.connect(('127.0.0.1',8 ...

  5. 【python】-- Socket粘包问题 ,解决粘包的几种方法、socket文件下载,md5值检验

    上一篇随笔:“socket 接收大数据”,在win系统上能够运行,并且解决了大数据量的数据传输出现的问题,但是运行在linux系统上就会出现如下图所示的情况: 就是服务端两次发送给客户端的数据(第一次 ...

  6. day31——recv工作原理、高大上版解决粘包方式、基于UDP协议的socket通信

    day31 recv工作原理 源码解释: Receive up to buffersize bytes from the socket. 接收来自socket缓冲区的字节数据, For the opt ...

  7. 一个完整的socket recv()案例,包括解决粘包、服务器主动推数据的问题

    前言: 本文是针对socket长连接(涉及到服务器主动推数据),每个包头的拼接算法和长度都不一样,具体的包头小伙伴们问自己公司的开发吧,本文只是提供思路.再啰嗦一句:recv到的包头中数字进行某种运算 ...

  8. python之socket编程------粘包

    一.粘包 什么是粘包 只有TCP只有粘包现象,UDP永远不会粘包 所谓粘包问题主要还是因为接收方不知道之间的界限,不知道一次性提取多少字节的数据所造成的 两种情况发生粘包: 1.发送端需要等缓冲区满才 ...

  9. python3全栈开发-什么是粘包、粘包现象、如何解决粘包

    一.粘包现象 让我们基于tcp先制作一个远程执行命令的程序(1:执行错误命令 2:执行ls 3:执行ifconfig) 注意注意注意: res=subprocess.Popen(cmd.decode( ...

随机推荐

  1. apache开源项目--Apache POI

    Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式 ...

  2. SharePoint2010主题和样式揭秘

    转:http://www.cnblogs.com/Ryu666/archive/2011/07/28/2119652.html 好久好久没写技术博客了,差点以为技术已经离我远去.但鱼离不开水,我怎能把 ...

  3. C# String.Format大全

    C# String.Format大全 ? ? ? 十进制的数字 ? ? string.Format("{0:D3}",23) 023 格式化十进制的数字 string.Format ...

  4. Android 应用启动渐变效果

    /** * 应用程序启动类:显示欢迎界面并跳转到主界面 * @author liux (http://my.oschina.net/liux) * @version 1.0 * @created 20 ...

  5. 知识面 z

    http://blog.csdn.net/sxhelijian/article/details/23163683 有了较宽和知识面,面对复试中不知道的问题,回答可以是:“这个问题,直接回答我没有把握, ...

  6. HDU-5391 Zball in Tina Town

    (n-1)!/n 就是如果n为素数,就等于n-1else为0. 求素数表: Zball in Tina Town Time Limit: 3000/1500 MS (Java/Others) Memo ...

  7. Test Controller Tool

  8. (1)I2c的简介和特性

    I2C我是想全面深入的从嵌入式软件工程师的角度做个理解,刚刚还申请了一个专栏,这个好好写.         学习技术从外文文档看起-- 要全面了解I2C,可以从<I2C-bus specific ...

  9. centos6.4 yum kvm

    1. 安装软件包:   yum -y install virt-manager; yum install qemu-kvm  yum install libvirt yum install libvi ...

  10. php升级到5.4

    这里使用 Webtatic EL6的YUM源来安装php5.4,我们首页安装Webtatic EL6 YUM源 rpm -Uvh http://repo.webtatic.com/yum/el6/la ...