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); } }

 

posted @ 2015-03-11 09:26  工控之家-Shrek  阅读(801)  评论(1编辑  收藏  举报