你的位置:首页 > 软件开发 > ASP.net > Socket解决粘包问题1

Socket解决粘包问题1

发布时间:2016-07-23 16:00:17
粘包是指发送端发送的包速度过快,到接收端那边多包并成一个包的现象,比如发送端连续10次发送1个字符a,因为发送的速度很快,接收端可能一次就收到了10个字符aaaaaaaaaa,这就是接收端的粘包。  可能我们在平时练习时没觉的粘包有什么危害,或者通过把发送端发送的速率调慢 ...

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

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

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

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

Socket解决粘包问题1Socket解决粘包问题1
 public static class PackageBuilder  {    static StringBuilder package = new StringBuilder();     public static get='_blank'>string[] BuildPackage(int count)    {      Random random = new Random();      int dataLength;      string[] packageArr = new string[count];      int myChar;      for (int j = 0; j < count; j++)      {        dataLength = random.Next(25) + 25;        package.Append("HEAD|H1|"+dataLength);        package.Append("data:");        for (int i = 0; i < dataLength-5; i++)        {          myChar = random.Next(26) + 65;          package.Append((char)myChar);        }        packageArr[j] = package.ToString();        package.Clear();      }      return packageArr;          }

原标题:Socket解决粘包问题1

关键词:socket

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录