/// <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);//继续处理接收到的数据 } } }