コード例 #1
0
    /// <summary>
    /// 接收数据
    /// </summary>
    /// <param name="ar"></param>
    private void OnReceive(IAsyncResult ar)
    {
        int    len = -1;
        string strID;

        byte[] id = new byte[4];
        try
        {
            EndPoint remote = (EndPoint)(ar.AsyncState);
            len = ServerSocket.EndReceiveFrom(ar, ref remote);

            //报文格式过滤
            if (buffer[0] == 0xA5 && buffer[1] == 0xA5 && buffer[len - 2] == 0x5A && buffer[len - 1] == 0x5A)
            {
                Array.Copy(buffer, 3, id, 0, 4);
                strID = UtilClass.byteToHexStr(id);

                //20180626由于武大项目采用轮询方式通信,因此不需要判断
                //判断哈希表中是否存在当前ID,不存在则创建,存在则把数据加入队列
                //if (htClient.ContainsKey(strID) == false)
                //{
                //    DataItem dataItem = new DataItem();
                //    dataItem.Init(ServerSocket, id, strID, updateDataLength, broadcastRemote); //初始化dataItem
                //    htClient.Add(strID, dataItem);
                //    //把设备信息存入数据库
                //    DbClass.addsensorinfo(strID, dataItem.HeartTime.ToString("yyyy-MM-dd HH:mm:ss"), dataItem.status.ToString());
                //}
                //else
                //{
                DataItem dataItem = (DataItem)htClient[strID];     //取出address对应的dataitem
                byte[]   recData  = new byte[len];
                Array.Copy(buffer, recData, len);
                dataItem.AnalyzeData(recData);

                //}
            }
            //继续接收数据
            ServerSocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref remote, new AsyncCallback(OnReceive), remote);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
            UtilClass.writeLog(ex.ToString());
        }
    }