示例#1
0
        private void Listen(int i)
        {
            tcpClients[i] = tcpListener.AcceptTcpClient();

            if (tcpClients[i].Connected)
            {
                tcpClients[i].NoDelay = true;
                networkStreams[i]     = tcpClients[i].GetStream();

                SendMessageRegisterPlayer(i, gameManager.RegisterPlayer());

                if (PlayerConnected() == false)
                {
                    byte[] message = Encoding.ASCII.GetBytes("server_full");
                    networkStreams[i].Write(message, 0, message.Length);
                    networkStreams[i].Close();
                    tcpClients[i].Close();

                    backgroundThreads[i].Abort();
                    backgroundThreads[i].Start();
                }

                while (true)
                {
                    if (tcpClients[i].Connected == false)
                    {
                        break;
                    }

                    byte[] messageReadByte = new byte[tcpClients[i].ReceiveBufferSize];
                    int    bytesRead       = networkStreams[i].Read(messageReadByte, 0, tcpClients[i].ReceiveBufferSize);
                    string messageRead     = Encoding.ASCII.GetString(messageReadByte, 0, bytesRead);

                    ParseMessage(messageRead);

                    string[] data = messageRead.Split(';');

                    if (data[0] == "player_exit")
                    {
                        tcpClients[i].Client.Disconnect(true);
                        break;
                    }

                    /*
                     * foreach (NetworkStream networkStream in networkStreams)
                     *  networkStream?.Write(messageReadByte, 0, bytesRead);
                     */
                }

                networkStreams[i].Close();
                networkStreams[i].Dispose();
                networkStreams[i] = null;
            }

            tcpClients[i].Close();
            tcpClients[i] = null;

            SendMessageResetGame();

            ResetThread(i);
        }