private void ReceiveMessage() { if (ReceiveDataQueue.Count > 0) { ReceiveSocketData rsd = ReceiveDataQueue.Dequeue(); DataStream stream = new DataStream(rsd.Data, true); ProtoManager.TryDeserialize(stream, rsd.Socket); } }
private void ReceiveSocket() { Client.Instance.Proxy.DataHolder.Reset(); while (!isStopReceive) { if (ServerSocket != null) { if (!ServerSocket.Connected) { //与服务器断开连接跳出循环 ClientLog.Instance.PrintError("Connect Server Failed."); ServerSocket.Close(); SocketErrorFlag = true; break; } try { //接受数据保存至bytes当中 byte[] bytes = new byte[4096]; //Receive方法中会一直等待服务端回发消息 //如果没有回发会一直在这里等着。 int i = ServerSocket.Receive(bytes); if (i <= 0) { ServerSocket.Close(); RoundManager.Instance.StopGame(); ClientLog.Instance.PrintError("[C]Socket.Close();"); break; } Client.Instance.Proxy.DataHolder.PushData(bytes, i); while (Client.Instance.Proxy.DataHolder.IsFinished()) { ReceiveSocketData rsd = new ReceiveSocketData(Client.Instance.Proxy.Socket, Client.Instance.Proxy.DataHolder.mRecvData); receiveDataQueue.Enqueue(rsd); Client.Instance.Proxy.DataHolder.RemoveFromHead(); } } catch (Exception e) { ClientLog.Instance.PrintError("[C]Failed by clientSocket error. " + e); if (ServerSocket != null) { ServerSocket.Close(); } SocketErrorFlag = true; break; } } } }
//接收客户端Socket连接请求 private void ReceiveSocket(object obj) { ServerProxy clientProxy = obj as ServerProxy; clientProxy.DataHolder.Reset(); while (!clientProxy.IsStopReceive) { if (!clientProxy.Socket.Connected) { //与客户端连接失败跳出循环 ServerLog.Instance.PrintClientStates("Client connect failed, ID: " + clientProxy.ClientID + " IP: " + clientProxy.Socket.RemoteEndPoint); ClientProxyClose(clientProxy); break; } try { byte[] bytes = new byte[1024]; int i = clientProxy.Socket.Receive(bytes); if (i <= 0) { ServerLog.Instance.PrintClientStates("Client shutdown, ID: " + clientProxy.ClientID + " IP: " + clientProxy.Socket.RemoteEndPoint + " Clients count: " + ClientsDict.Count); ClientProxyClose(clientProxy); break; } clientProxy.DataHolder.PushData(bytes, i); while (clientProxy.DataHolder.IsFinished()) { ReceiveSocketData rsd = new ReceiveSocketData(clientProxy.Socket, clientProxy.DataHolder.mRecvData); ReceiveDataQueue.Enqueue(rsd); clientProxy.DataHolder.RemoveFromHead(); OnReceiveMessage(); } } catch (Exception e) { ServerLog.Instance.PrintError("Failed to ServerSocket error,ID: " + clientProxy.ClientID + " Error:" + e.ToString()); ClientProxyClose(clientProxy); break; } } }
//接收到数据放入数据队列,按顺序取出 void Update() { if (Client.Instance.IsStandalone) { return; } if (!SocketErrorFlag) { if (receiveDataQueue.Count > 0) { ReceiveSocketData rsd = receiveDataQueue.Dequeue(); DataStream stream = new DataStream(rsd.Data, true); ProtoManager.TryDeserialize(stream, rsd.Socket); } Client.Instance.Proxy.Send(); } else { Client.Instance.Proxy.ClientState = ProxyBase.ClientStates.Offline; RoundManager.Instance.StopGame(); SocketErrorFlag = false; } }