Socket解决粘包问题2

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

        private void AsynReceive(){byte[] data = new byte[1024];//接收缓存string receiveStr;string[] sendArr = PackageBuilder.BuildPackage(10);//生成发送数组,10个包socket.BeginReceive(data, 0, data.Length, SocketFlags.None, asyncResult => {int length = socket.EndReceive(asyncResult);receiveStr = Encoding.ASCII.GetString(data, 0, length);//获取缓存中的信息//    Console.WriteLine(receiveStr);if (receiveStr == "1")      //标志字符'1',如果收到1,则发送测试包给客户端,如果不是1,继续接受
                {for (int i = 0; i < 10; i++){Console.WriteLine("第{0}次发送:",i);AsynSend(sendArr[i]);//     Thread.Sleep(200);
                    }}elseAsynReceive();}, null);}
View Cosde

其中if (receiveStr == "1")是接收判断,如果收到客户端发来的1,则发送测试包给客户端,如果不是1,继续接收。因为是异步发送,所以Console.WriteLine("第{0}次发送:",i);显示可能和发送数据不同步,但肯定是发送了10次。

测试一下,发送10次,接收端收到结果如下:

发了10次,而只收了8次,从上图中我们可以发现第6次和第7次发生了粘包,两个包被当作1个包接收了,如果你编写解包程序时不考虑粘包,那么解包循环在第7次解包时会抛异常。当然一种快捷的避免粘包方式是在发送函数的 AsynSend(sendArr[i]);下面加上Thread.Sleep(200);减少发送频率,但这不是长久之计,接下来我们进入客户端来处理粘包问题。

客户端主要是修改了SyncReceive方法,使用StringBuilder来做接收,因为StringBuilder较于string而言,增加字符串,删除字符串的效率比较高,代码如下:

 string[] receiveArr = new string[10];//用于存储接收到的数据int arri=0;//数组位序public virtual void SyncReceive(){//StringBuilder sb = new StringBuilder(1024*1024);StringBuilder receiveSb = new StringBuilder();      //接收字符串bufferstring receiveStr;            //解包过程中用于 中间处理  int index;       //位序,用于解包int dataLength; //存储接收包中的数据长度int i = 0;Thread th = new Thread(() =>{while (receiveFlag){byte[] buffer = new byte[1024];int r = socket.Receive(buffer);string str = Encoding.ASCII.GetString(buffer, 0, r);    //只是用来显示Console.WriteLine("第{0}次收到数据:{1}",i++,str);Console.WriteLine();receiveSb.Append(str);              //存储接收字符串,可能存多个包receiveStr = receiveSb.ToString();index = receiveStr.IndexOf("data:");//可能有多个"data"while (index > 1){dataLength = int.Parse(receiveStr.Substring(index - 2, 2));//数据长度规定为2个字节receiveArr[arri] = receiveStr.Substring(index, dataLength);//保存数据到数组中Console.WriteLine("保存的数据数组[{0}]:{1}",arri,receiveArr[arri++]);receiveSb.Remove(0, 10 + dataLength);//包头+数据长度字节共10个字节"HEAD|H1|38",后面是数据"data:xxxxxxxxxxxxxxxxxxxx"receiveStr = receiveSb.ToString();index = receiveStr.IndexOf("data:");//寻找下一个"data",如果没有跳出循环
                    }//sb.AppendFormat("{0}", Encoding.ASCII.GetString(buffer, 0, r));
                    }});th.Start();}
View Code

方法上面加了两个全局变量,receiveArr是一个数组,用于保存接收到的实时数据,这些数据可以用于前台展示,也可以直接保存到数据库;arri是数组位序,运行结果如下:

如图所示,客户端接收了7次数据,第一次有4个包粘在了一起,但我们通过合适的解包,依然将10次数据分开保存在字符串数组中。

客户端要先发送"1"标志给客户端才能执行上面的程序,     SynSend("1");

程序的源码下载地址:

链接:http://pan.baidu.com/s/1nvfa8lF 密码:zjoa

粘包的处理是比较简单的,更麻烦的是分包,虽然不常见,但也要考虑,后面考虑做一下分包的处理,程序写的比较毛糙,如有不足之处希望大家指出。

 

转载于:https://www.cnblogs.com/gongheng/p/5699092.html

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

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

相关文章

C# WebBrowser 取 window.open 新窗口 url的方法

System.Windows.Forms.WebBrowser wb; //WebBrowser 对象wb.NewWindow new CancelEventHandler(wb_NewWindow);wb.DocumentCompleted delegate{ #region 处理window.open新开窗口的问题System.Windows.Forms.HtmlElement html wb.Document.CreateElemen…

linux之rpm

1、rpm Linux rpm 命令用于管理套件 -a  查询所有套件。-b<完成阶段><套件档>+或-t <完成阶段><套件档>+  设置包装套件的完成阶段,并指定套件档的文件名称。-c  只列出组态配置文件,本参数需配合"-l"参数使用。-d  只列出文本文件,…

保姆级的HTML零基础教程少见吧?这是第一节(1)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

WPF 通用权限开发框架 (ABP)

前言对于大部分.NET 开发者来说, 都比较熟悉目前流行的ABP框架, 基于开源的ABP框架, 可以自己进行二次开发, 无需重新开发一些基础功能,例如: 用户角色管理、权限、组织、多租户等等。但是对于ABP框架来说, 提供给.NET开发者的可选项非常少, 目前也仅仅是提供了基于Web的解决方…

甘肃省事业单位公考招聘考试权威复习资料---GIS专业综合复习题(一)

1. 数字城市 以计算机技术、多媒体技术和大规模存储技术为基础,以宽带网络为纽带,运用遥感、全球定位系统、地理信息系统、遥测、仿真-虚拟等技术,对城市进行多分辨率、多尺度、多时空和多种类的三维描述,即利用信息技术手段把城市的过去、现状和未来的全部内容在网络上进…

MongoDB 3.0 新增特性一览

引言 在历经版本号修改&#xff08;2.8版本直接跳到3.0版本&#xff09;和11个rc版本之后&#xff0c;MongoDB3.0于2015年3月3日正式发布。可以毫不夸张的说&#xff0c;该版本的新增特性标志着MongoDB这款典型的NoSQL数据库已经进入了一个全新的发展阶段。本文以下内容会逐个盘…

[华清远见]FPGA公益培训

本套视频教程为华清远见 网络公益培训活动&#xff0c;主讲人&#xff1a;姚远老师&#xff0c;华清远见高级讲师。 ---------------------------------------------------------------------------------------- “红色飓风FPGA普及行动” 课程内容&#xff1a; 第一讲、FPGA设…

单一职责原则--设计模式系列

定义 一个类只负责一项职责 职责扩散 什么叫职责扩散&#xff0c;就是职责再进行细化&#xff0c;就拿公司来说&#xff0c;好比客户的需求&#xff0c;需求是不断变化的&#xff0c;而且存在极大的不确定性&#xff0c;说不定哪天上司找到你要重新细化某个需求 所以最好在职责…

淘宝网的技术发展史(一)——个人网站时代

《天下网商经理人》十月刊开始将连载系列文章《淘宝网的技术发展史》&#xff0c;为读者描述淘宝网在整个发展过程中&#xff0c;所有的主动和被动的技术变革的前因后果。 文/淘宝技术大学培训专家 子柳 前言 11月11日&#xff0c;这个棍子最多的日子被网民自我调侃变成了一个…

linux之彻底卸载mysql

1 问题 在centos系统下彻底卸载mysql 2 操作方式 1)、查看mysql的信息 rpm -qa | grep -i mysql mysql57-community-release-el7-10.noarch mysql-errmsg-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 mysql-8.0.17-3.module_el8.0.0+181+899d6349.x86_64 mysql-server-8.…

使用 Vscode 编写 HTML 文档竟然可以自动写代码(2)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

甘肃省事业单位公考招聘考试权威复习资料---GIS专业全真模拟题(一)

一、单选 1. 以下那个可以从像元级别、特征级别进行&#xff08; &#xff09;。 A.增强 B.锐化 C.重采样 D.裁剪 2. 1:10000比例尺地形图的格网大小是&#xff08; &#xff09;。 A.30m B.100m C.10m D.5m 3. 电子地图中加载矢量数据属于&#xff08; &…

为什么 Docker 和 Kubernetes 是用 Go 写的而不是 C# ?

这是 Reddit 平台上面这几天一篇比较热门的帖子, 非常有意思&#xff0c;本文我列出了几个高赞的回答。&#x1f466; HahahahahaSoFunny为什么 Docker 和 Kubernetes 工具是用 Go 写的而不是 C#&#xff1f;总所周知&#xff0c;现在开发人员使用的很多新工具大多是用 Go 写的…

打造最舒适的webview调试环境

你在做移动web开发的时候是不是只是在Chrome下开启移动模式&#xff0c;然后就啪啪啪闷头敲代码了&#xff1f;如果你平时只是做做宣传页&#xff0c;Chrome的移动模式可能就能满足你。但是现在越来越多的应用采用Hybrid的开发方式&#xff0c;这样的话就可能在web页面上调用we…

淘宝网的技术发展史(二) ——Oracle替换MySQL

本文是《淘宝网的技术发展史》系列连载文的第二篇&#xff0c;在告别个人网站时代后&#xff0c;淘宝网的技术发展迎来了由Oracle开启的第二个时代。文/淘宝技术大学培训专家 子柳MySQL撑不住了 淘宝网作为个人网站发展的时间其实并不长&#xff0c;由于它太引人注目了&#xf…

数据结构——不相交集(并查集)

目的&#xff1a;解决等价问题。 表示方法&#xff1a;森林&#xff0c;底层实现用数组 主要操作&#xff1a;find()、union() 优化手段&#xff1a; ①find()时路径压缩 ②union()时按规模合并、按树高合并&#xff08;依据情况而定&#xff09; Java实现&#xff1a; class D…

Android之抓取adb logcat全日志后怎么过滤掉只包含当前app进程的日志(一般抓启动app奔溃日志)

1 、问题 有时候我们启动APP的时候&#xff0c;APP奔溃&#xff0c;在android studio里面日志可能冲掉&#xff0c;或者是云平台的手机安装的app&#xff0c;根本就没有android stduio&#xff0c;那我们用什么办法快速知道启动奔溃日志呢&#xff1f; 2、解决办法 我们先需要…

一个基础的 HTML 文档有哪些标签?(3)

作者简介 作者名&#xff1a;1_bit 简介&#xff1a;CSDN博客专家&#xff0c;2020年博客之星TOP5&#xff0c;蓝桥签约作者。15-16年曾在网上直播&#xff0c;带领一批程序小白走上程序员之路。欢迎各位小白加我咨询我相关信息&#xff0c;迷茫的你会找到答案。 目录 HTML基…

考研:中国科学院地理所历年GIS研究生入学考试真题汇总

中科院地理所1997年GIS研究生入学试题 一、名词解释 1.拓扑关系 2.缓冲分析 3.关系数据模型 4.空间叠加 二、简答题 1、GIS的主要功能略 2、企业GIS系统的特色 三、问答题(选2) 1、GIS基本组成与主要应用领域 2、地理科学数据集成与管…

能上架App的GooglePlay开发者账号获取流程

googleplay 开发者账号申请流程 接到公司号召&#xff0c;要让我们的app走向世界&#xff0c;上架GooglePlay&#xff0c;都说天朝的Android 程序员是折翼的天使&#xff0c;猛然发现写了做么多年的Android&#xff0c;竟然不知道怎么成为GooglePlay开发者。 以前尝试过&#x…