博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UDP通信后端缓冲区 List<T>
阅读量:5114 次
发布时间:2019-06-13

本文共 1761 字,大约阅读时间需要 5 分钟。

记录项目中的经验,今年的计划:每次项目中解决的难点,还有值得记录下来的知识,都写到博客中,

希望大家有更好的方法分享,也希望能帮助上刚入门的,耶稣爱你,

 

前言

上一次项目,上位机软件和设备端通信采用的是TCP的方式,因为不能在socket接收事件中做业务逻辑处理,

可能的原因:

1、业务逻辑复杂;

2、设备发送数据的频率过快:

所以接收到数据后,先存放到一个自定义缓冲区中,启动一个后端线程,从缓冲区中取出数据,然后解析,做业务处理;

这个项目中缓冲区使用的是  :  

public static byte[] buffer;

这次项目中使用的缓冲区是,使用struct比使用class可能更好一些(自己这么认为,因为struct是值类型,class是引用类型)

//消息结构体public struct UsertData{      //设备的IP Port信息      public string devNet;      //设备的数据      public byte[] devData;}//用户数据缓冲区public static List
userData = new List
();

使用缓冲区

缓冲区已经建立好了,怎么使用呢,有两个地方会操作到该缓冲区,

第一:socket接收回调函数中

public void ReceiveCallback(IAsyncResult ar){    UserData tmpData = new UserData();    IPEndPoint client = userver.ipLocalEndPoint;    Byte[] recdata = userver.NetWork.EndReceive(ar, ref client);        //得到设备端发送的数据和ip port信息存储到缓冲区    tmpData.devData = (byte[])recdata.Clone();  //接收数据复制    tmpData.devNet = client.ToString();         //IP 和 port 转换到string    userData.Add(tmpData); }

 

第二:解析线程中

public void ParseData(){      //解析数据线程      Thread Parse = new Thread(new ThreadStart(ParseData));      Parse.IsBackground = true;      Parse.Start();      while (true)      {         if (userData.Count > 0)         {            //取数据解析            UserData tmp = new UserData();            tmp = userData[0];    //从缓冲区中去数据            userData.Remove(tmp); //取完数据,从缓冲区中删除该 //简单的规约解析(业务逻辑)            if (tmp.devData[1] == 0xEE)            {               byte[] data = new byte[] { 0xFF, 0xFF, 0xFF };  //回复设备               string[] IPAddress = tmp.devNet.Split(':');               udpserver.NetWork.Send(data, data.Length, IPAddress[0], int.Parse(IPAddress[1]));            }          }          Thread.Sleep(100);      }}

 

转载于:https://www.cnblogs.com/craigtao/p/4328994.html

你可能感兴趣的文章
MySQL索引背后的数据结构及算法原理
查看>>
#Leetcode# 209. Minimum Size Subarray Sum
查看>>
SDN第四次作业
查看>>
DM8168 DVRRDK软件框架研究
查看>>
django迁移数据库错误
查看>>
yii 跳转页面
查看>>
洛谷 1449——后缀表达式(线性数据结构)
查看>>
Data truncation: Out of range value for column 'Quality' at row 1
查看>>
Dirichlet分布深入理解
查看>>
(转)Android之发送短信的两种方式
查看>>
字符串处理
查看>>
HtmlUnitDriver 网页内容动态抓取
查看>>
ad logon hour
查看>>
获得进程可执行文件的路径: GetModuleFileNameEx, GetProcessImageFileName, QueryFullProcessImageName...
查看>>
证件照(1寸2寸)拍摄处理知识汇总
查看>>
罗马数字与阿拉伯数字转换
查看>>
Eclipse 反编译之 JadClipse
查看>>
Python入门-函数
查看>>
[HDU5727]Necklace(二分图最大匹配,枚举)
查看>>
距离公式汇总以及Python实现
查看>>