Exemple #1
0
 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;
                }
            }
        }
    }
Exemple #3
0
    //接收客户端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;
        }
    }