예제 #1
0
        private void ReceiveCallback(IAsyncResult ar)
        {
            var state   = (SocketState)ar.AsyncState;
            var handler = state.Socket;

            try
            {
                var message = SocketHarnessMessage.ProcessMessage(ar);
                handler.EndReceive(ar);

                switch (message.MessageType)
                {
                case SocketHarnessMessage.MessageType.Command:
                    HandleCommandMessage(message.Message);
                    break;

                default:
                    throw new ArgumentException("Cannot process client message of type " + message.MessageType);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Client sent bad data " + ex);
                Console.WriteLine("Sending no move command");
                HandleCommandMessage("");
            }

            if (handler.Connected)
            {
                BeginRecieve(handler);
            }
        }
예제 #2
0
        private void GameSocketMessage(IAsyncResult ar)
        {
            try
            {
                var state  = (SocketState)ar.AsyncState;
                var socket = state.Socket;

                var message = SocketHarnessMessage.ProcessMessage(ar);
                switch (message.MessageType)
                {
                case SocketHarnessMessage.MessageType.GameMap:
                    UpdateGameMap(message.Message);
                    break;

                case SocketHarnessMessage.MessageType.Killed:
                    killed = true;
                    break;

                case SocketHarnessMessage.MessageType.CommandFailed:
                    CommandFailedMessage(message.Message);
                    break;

                case SocketHarnessMessage.MessageType.PlayerRegistered:
                    playerKey = message.Message.First();
                    break;

                case SocketHarnessMessage.MessageType.GameComplete:
                    Console.Clear();
                    Console.WriteLine("Game Has ended!");

                    socket.EndReceive(ar);
                    if (socket.Connected)
                    {
                        socket.Close();
                        return;
                    }

                    break;

                default:
                    throw new ArgumentException("Cannot process this message type " + message.MessageType);
                }

                state.ByteBuffer = new byte[20480];

                socket.EndReceive(ar);
                socket.BeginReceive(state.ByteBuffer, 0, state.ByteBuffer.Length, SocketFlags.None, GameSocketMessage,
                                    state);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
예제 #3
0
        private void ReceiveCallBack(IAsyncResult ar)
        {
            var socketState = (SocketState)ar.AsyncState;
            var socket      = socketState.Socket;

            var result = SocketHarnessMessage.ProcessMessage(ar);

            socket.EndReceive(ar);
            switch (result.MessageType)
            {
            case SocketHarnessMessage.MessageType.RegisterPlayer:
                HandleRegistration(socket, result.Message);
                break;

            default:
                throw new ArgumentException("Only registration messages allowed " + result.MessageType);
            }
        }
예제 #4
0
        private void RegistrationMessage(IAsyncResult ar)
        {
            var state  = (SocketState)ar.AsyncState;
            var socket = state.Socket;

            var message = SocketHarnessMessage.ProcessMessage(ar);
            int port    = 0;

            switch (message.MessageType)
            {
            case SocketHarnessMessage.MessageType.RegistrationPort:
                port = Int32.Parse(message.Message);
                break;

            default:
                throw new ArgumentException("Expected registration port message " + message.MessageType);
            }

            socket.EndReceive(ar);

            if (socket.Connected)
            {
                socket.Disconnect(false);
                socket.Close();
            }
            socket.Close();

            var ipHost = Dns.GetHostEntry(_hostname);

            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

            state.Socket     = _socket;
            state.ByteBuffer = new byte[20480];

            _socket.BeginConnect(ipHost.AddressList.Last(x => x.AddressFamily == AddressFamily.InterNetwork), port, GameSocketConnected, state);

            Console.WriteLine("Congratulations, player registered on server.");
            Console.WriteLine("Please wait while the others connect and the game is started.");
            Console.WriteLine("To move, type a,w,s,d and press enter");
            Console.WriteLine("To plant a bomb, type z and enter");
            Console.WriteLine("You can reduce the bomb timer to 1 using x");
        }