示例#1
0
        /* Método que gerencia o processo de monitoramento da porta de
         *   comunicação. É recomendado que este método seja executado em uma
         *   thread exclusiva.
         * Além de iniciar o processo de escuta de uma porta, este método
         *   recebe as requisições das aplicações clientes, encaminha ao
         *   servidor de jogos (referenciado pela variável server) e envia
         *   a resposta das mensagens aos clientes.
         */
        public void startUDPServer()
        {
            Console.WriteLine("Starting UDP echo at ip: " + ip + " port: " + port);

            int receivedDataLength;

            byte[] data = new byte[65530];

            IPEndPoint ipEP = new IPEndPoint(IPAddress.Parse(ip), port);

            socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

            IPEndPoint sender    = new IPEndPoint(IPAddress.Any, 0);
            EndPoint   tmpRemote = (EndPoint)(sender);

            socket.Bind(ipEP);
            while (!ended)
            {
                string message        = "";
                string answer_message = "";
                byte[] response       = new byte[65530];
                try
                {
                    sender    = new IPEndPoint(IPAddress.Any, 0);
                    tmpRemote = (EndPoint)(sender);


                    data = new byte[65530];
                    receivedDataLength = socket.ReceiveFrom(data, ref tmpRemote);
                    message            = Encoding.ASCII.GetString(data, 0, receivedDataLength);
                    Console.WriteLine("Received: '" + message + "'");

                    AddressPort    ClientAddress = new AddressPort(sender.Address, sender.Port);
                    RequestMessage req_message   = new RequestMessage(message, ClientAddress);
                    AnswerMessage  am            = GameServer.executeRequest(req_message);
                    if (am.GID >= 0)
                    {
                        am.GAME_GENERAL_STATUS = GameServer.gameGeneralStatus(am.GID, req_message.PLAYER);
                    }
                    else
                    {
                        am.GAME_GENERAL_STATUS = AnswerMessage.GGS_NOTHING_TO_BE_DONE;
                    }
                    answer_message = am.message2string();

                    response = Encoding.ASCII.GetBytes(answer_message);
                }
                catch (Exception e)
                {
                    if (System.Type.Equals(new SocketException().GetType(), e.GetType()))
                    {
                        ended = true;
                        return;
                    }
                    else
                    {
                        Console.Error.WriteLine("ERROR: " + message + "  " + e.ToString());
                        answer_message = new AnswerMessage(false, AnswerMessage.UNKNOWN_ERROR, "", -1).message2string();
                        response       = Encoding.ASCII.GetBytes(answer_message);
                    }
                }
                if (!ended)
                {
                    Console.WriteLine("Sending: " + answer_message);
                    socket.SendTo(response, response.Length, SocketFlags.None, tmpRemote);
                    server.insertLogMessage("INPUT", message);
                    server.insertLogMessage("OUTPUT", answer_message);
                }
            }
        }
示例#2
0
        /* Método que gerencia o processo de monitoramento da porta de
         *   comunicação. É recomendado que este método seja executado em uma
         *   thread exclusiva.
         * Além de iniciar o processo de escuta de uma porta, este método
         *   recebe as requisições das aplicações clientes, encaminha ao
         *   servidor de jogos (referenciado pela variável server) e envia
         *   a resposta das mensagens aos clientes.
         */
        public void startTCPServer()
        {
            Console.WriteLine("Starting TCP echo at ip: " + ip + " port: " + port);

            listener = new TcpListener(IPAddress.Parse(ip), port);
            listener.Start();

            TcpClient     ourTCP_Client = null;
            NetworkStream ourStream     = null;

            while (!ended)
            {
                string message        = "";
                string answer_message = "";
                byte[] response       = new byte[65530];
                try
                {
                    ourTCP_Client = listener.AcceptTcpClient();
                    ourStream     = ourTCP_Client.GetStream();
                    byte[] data      = new byte[ourTCP_Client.ReceiveBufferSize];
                    int    bytesRead = ourStream.Read(data, 0, System.Convert.ToInt32(ourTCP_Client.ReceiveBufferSize));
                    // echo the data we got to the console until the newline, and delay closing our window.
                    message = Encoding.ASCII.GetString(data, 0, bytesRead);

                    Console.WriteLine("Received: '" + message + "'");

                    AddressPort    ClientAddress = new AddressPort(IPAddress.Parse("172.16.36.85"), 8623);
                    RequestMessage req_message   = new RequestMessage(message, ClientAddress);
                    AnswerMessage  am            = GameServer.executeRequest(req_message);
                    if (am.GID >= 0)
                    {
                        am.GAME_GENERAL_STATUS = GameServer.gameGeneralStatus(am.GID, req_message.PLAYER);
                    }
                    else
                    {
                        am.GAME_GENERAL_STATUS = AnswerMessage.GGS_NOTHING_TO_BE_DONE;
                    }
                    answer_message = am.message2string();

                    response = Encoding.ASCII.GetBytes(answer_message);
                }
                catch (Exception e)
                {
                    if (System.Type.Equals(new SocketException().GetType(), e.GetType()))
                    {
                        ended = true;

                        if (ourTCP_Client != null)
                        {
                            ourStream.Flush();
                            ourStream.Close();
                            ourTCP_Client.Close();
                        }
                        listener.Stop();

                        return;
                    }
                    else
                    {
                        Console.Error.WriteLine("ERROR: " + message + "  " + e.Message);
                        answer_message = new AnswerMessage(false, AnswerMessage.UNKNOWN_ERROR, "", -1).message2string();
                        response       = Encoding.ASCII.GetBytes(answer_message);
                    }
                }
                if (!ended)
                {
                    server.insertLogMessage("INPUT", message);
                    server.insertLogMessage("OUTPUT", answer_message);
                    Console.WriteLine("Sending: " + answer_message);
                    ourStream.Write(response, 0, response.Length);
                    ourStream.Flush();
                    ourTCP_Client.Close();
                }
            }
            return;
        }