UDP通信后端缓冲区 List<T>
记录项目中的经验,今年的计划:每次项目中解决的难点,还有值得记录下来的知识,都写到博客中,
希望大家有更好的方法分享,也希望能帮助上刚入门的,耶稣爱你,
前言
上一次项目,上位机软件和设备端通信采用的是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<UsertData> userData = new List<UsertData>();
使用缓冲区
缓冲区已经建立好了,怎么使用呢,有两个地方会操作到该缓冲区,
第一: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); } }