Esempio n. 1
0
 /// <summary>
 /// 接收数据
 /// </summary>
 /// <param name="reciveEventArgs"></param>
 private void ProcessRecive(SocketAsyncEventArgs reciveEventArgs)
 {
     try
     {
         #region 处理接收到的UserToken
         //如果连接不正常,或者接收到的数据长度为0 则主动断开连接
         if (reciveEventArgs.SocketError != SocketError.Success || reciveEventArgs.BytesTransferred == 0)
         {
             closeConnect(reciveEventArgs.AcceptSocket);
             reciveEventArgs = null;
             return;
         }
         int    len      = reciveEventArgs.BytesTransferred;//记录接收到的数据包长度
         byte[] data_pac = new byte[len];
         Array.Copy(reciveEventArgs.Buffer, reciveEventArgs.Offset, data_pac, 0, len);
         Func <bool, byte[]> appendData = (ok) =>
         {
             byte[] newData;
             if (reciveEventArgs.UserToken != null)
             {
                 byte[] tmp = (byte[])reciveEventArgs.UserToken;
                 newData = new byte[len + tmp.Length];
                 Array.Copy(tmp, 0, newData, 0, tmp.Length);
                 Array.Copy(data_pac, 0, newData, tmp.Length, len);
                 if (ok)
                 {
                     reciveEventArgs.UserToken = null;
                 }
             }
             else
             {
                 newData = data_pac;
             }
             return(newData);
         }; //匿名方法appendData结束
         if (reciveEventArgs.AcceptSocket.Available != 0)
         {
             reciveEventArgs.UserToken = appendData(false);
         }
         else
         {
             data_pac = appendData(true);
             ClientOP client = new ClientOP();//记录当前连接过来的客户端对象
             client.cSocket = reciveEventArgs.AcceptSocket;
             if (Analyze(data_pac, len, client))
             {
                 string msg = client.Pac_Msg;
                 if (!string.IsNullOrEmpty(msg))
                 {
                     string      decodeMsg  = ZipHelper.GZipDecompressString(msg);//将接收到的数据进行Gizp解压
                     AnalyzeData analzeData = new AnalyzeData();
                     bool        isZ;
                     string      sendMsg = analzeData.StartAnalyze(decodeMsg, client, out isZ);
                     Send(sendMsg, client.cSocket, isZ);
                     //Send(decodeMsg, client.cSocket);
                 }
                 if (client.Pac_Type == 101)
                 {
                     Send("socket连接成功", client.cSocket, false);
                 }
             }
             else//Analyze方法的else
             {
                 Send("数据解析失败", client.cSocket, false);
                 client = null;
                 closeConnect(reciveEventArgs.AcceptSocket);
                 dic_Clients.TryRemove(client.ConID, out client);
                 reciveEventArgs.AcceptSocket = null;
             }//Analyze方法的if-else结束
         }
         #endregion
     }
     catch (Exception ex)
     {
         LogHelper.WriteLog(typeof(WsSocket), ex);
     }
     finally
     {
         if (reciveEventArgs != null && reciveEventArgs.AcceptSocket != null)
         {
             StartRecive(reciveEventArgs);//继续处理接收到的数据
         }
     }
 }