void ReceiveComplte(IAsyncResult result) { ClientWrapper client = result.AsyncState as ClientWrapper; List <string> msgArray = new List <string>(); Exception Error = null; int ReceiveByteCount = -1; int msglen = -1; int ReceivedBufferLength = client.Buffer.Length; try { ReceiveByteCount = client.Socket.EndReceive(result);//当客户端刷新时此处会引起异常。 //ReceiveString = Encoding.UTF8.GetString(client.Buffer, 0, ReceiveByteCount);//如果不考虑Flash这样的客户端,使用此句即可。 //ReceiveString = Encoding.UTF8.GetString(client.Buffer, 4, ReceiveByteCount-4);//考虑Flash版前4个字节用来存放消息长度。 string TestString = Encoding.UTF8.GetString(client.Buffer, 0, ReceiveByteCount); if (TestString.StartsWith("<policy-file-request/>")) { Error = new Exception("<policy-file-request/>"); FileStream policyStream = new FileStream("PolicyFile.xml", FileMode.Open); byte[] m_policy = new byte[policyStream.Length]; policyStream.Read(m_policy, 0, m_policy.Length); policyStream.Close(); //client.Socket.BeginSend(m_policy, 0, m_policy.Length, SocketFlags.None, new AsyncCallback(SendComplete), list); client.Socket.BeginSend(m_policy, 0, m_policy.Length, SocketFlags.None, null, null); client.Socket.Close(); ClientList.Remove(client); } else { msgArray = GetStringArray(client.Buffer, 0); //byte[] Buf = new byte[client.Buffer.Length]; //for (int i = 0; i < client.Buffer.Length; i++) //{ // Buf[i] = client.Buffer[i]; //} //msgArray = GetStringArray(Buf,0); //string sep = Encoding.UTF8.GetString(client.Buffer, 0, 4); //string[] temp = TestString.Split(new string[] { sep }, StringSplitOptions.RemoveEmptyEntries); //foreach (var str in temp) //{ // msgArray.Add(str); //} //string[] b = temp; //msgArray.Add(TestString.Replace(sep, "")); //byte[] temp = new byte[4]; //temp[0] = client.Buffer[0]; //temp[1] = client.Buffer[1]; //temp[2] = client.Buffer[2]; //temp[3] = client.Buffer[3]; //msglen = temp.ToInt32(); //Msg = Encoding.UTF8.GetString(client.Buffer, 4, msglen);//考虑Flash版前4个字节用来存放消息长度。 client.Buffer = new byte[client.Buffer.Length]; client.Socket.BeginReceive(client.Buffer, 0, client.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveComplte), client); } } catch (Exception ex) { Error = ex; //ClientList.Remove(client); //client.Socket.Close(); } //if (Received != null) //{ // foreach (var str in msgArray) // { // Received(this, new ReceiveEventArgs() // { // AsyncResult = result, // Msg = str, // Error = Error, // Client = client, // ReceiveByteCount = ReceiveByteCount, // ClientSetByteCount = msglen, // ReceivedBufferLength = ReceivedBufferLength // }); // //Thread.Sleep(1000); // } // //Received(this, new ReceiveEventArgs() // //{ // // AsyncResult = result, // // Msg = Msg, // // Error = Error, // // Client = client, // // ReceiveByteCount = ReceiveByteCount, // // ClientSetByteCount = msglen, // // ReceivedBufferLength = ReceivedBufferLength // //}); //} foreach (var str in msgArray) { //Received(this, new ReceiveEventArgs() //{ // AsyncResult = result, // Msg = str, // Error = Error, // Client = client, // ReceiveByteCount = ReceiveByteCount, // ClientSetByteCount = msglen, // ReceivedBufferLength = ReceivedBufferLength //}); RaiseReceived(this, new ReceiveEventArgs() { AsyncResult = result, Msg = str, Error = Error, Client = client, ReceiveByteCount = ReceiveByteCount, ClientSetByteCount = msglen, ReceivedBufferLength = ReceivedBufferLength }); } }
void ConnectComplate(IAsyncResult result) { ClientWrapper client = new ClientWrapper(); Exception Error = null; try { client.Socket = socket.EndAccept(result); if (client.Socket.Connected) { client.Buffer = new byte[BufferSize]; ClientList.Add(client); client.Socket.BeginReceive(client.Buffer, 0, client.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveComplte), client); //client.Socket.BeginReceive(client.Buffer, 0, 4, SocketFlags.None, new AsyncCallback(ReceiveComplte), client); //if (IsReceiveMessageLength) //{ //client.Socket.BeginReceive(client.Buffer, 0, 4, SocketFlags.None, new AsyncCallback(ReceiveComplte), client); //} //else //{ // client.Socket.BeginReceive(client.Buffer, 0, MesssageLength, SocketFlags.None, new AsyncCallback(ReceiveComplte), client); //} } socket.BeginAccept(new AsyncCallback(ConnectComplate), null); } catch (Exception ex) { Error = ex; } //if (Connected != null) //{ // Connected(this, new ConnectEventArgs() // { // AsyncResult = result, // Error = Error // }); //} RaiseConnected(this, new ConnectEventArgs() { AsyncResult = result, Error = Error }); ////通知客户端状态(压币或开奖),客户端在进入游戏时需要获取此值 //Infomation info = new Infomation() { IsPress = (GState == GameState.Press), IsOpen = (GState == GameState.Open) }; ////JsonConverter converter=new //string Jstring = JsonConvert.SerializeObject(info); //byte[] buffer = Encoding.UTF8.GetBytes(Jstring); //if (buffer.Length > ConstParameter.BUFFER_SIZE) //{ // //此时应该报错 (暂不处理) //} //client.Socket.BeginSend(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(SendComplete), client); //要用一个没有数据的Buffer接收 }