示例#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 HandleRegistration(Socket socket, String name)
        {
            var port   = 20000 + _players.Count;
            var player = new SocketServer(name, port);

            _players.Add(player);

            SocketHarnessMessage.SendMessage(socket, SocketHarnessMessage.MessageType.RegistrationPort, port.ToString(), Callback);
        }
示例#3
0
        private void RegisterCallback(IAsyncResult ar)
        {
            var state  = (SocketState)ar.AsyncState;
            var socket = state.Socket;

            state.ByteBuffer = new byte[10240];

            socket.BeginReceive(state.ByteBuffer, 0, state.ByteBuffer.Length, SocketFlags.None, RegistrationMessage, state);
            SocketHarnessMessage.SendMessage(socket, SocketHarnessMessage.MessageType.RegisterPlayer, _username);
        }
示例#4
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);
            }
        }
示例#5
0
        public void SendCommand(String command)
        {
            if (_socket != null && _socket.Connected && !killed)
            {
                SocketHarnessMessage.SendMessage(_socket, SocketHarnessMessage.MessageType.Command, command);
                Console.WriteLine("Your command has been sent to the server.  Wait for the other players and the map will update");
            }

            if (killed)
            {
                Console.WriteLine("You have been killed and can no longer send commands");
            }
        }
示例#6
0
 public override void PlayerCommandFailed(ICommand command, string reason)
 {
     if (_clientSocket.Connected)
     {
         try
         {
             SocketHarnessMessage.SendMessage(_clientSocket, SocketHarnessMessage.MessageType.CommandFailed, reason);
         }
         catch (Exception ex)
         {
             Console.WriteLine("Could not send message to client " + Name + " because it disconnected");
             Console.WriteLine(ex);
         }
     }
 }
示例#7
0
 public override void GameEnded(GameMap gameMap)
 {
     if (_clientSocket.Connected)
     {
         try
         {
             SocketHarnessMessage.SendMessage(_clientSocket, SocketHarnessMessage.MessageType.GameComplete, "");
         }
         catch (Exception ex)
         {
             Console.WriteLine("Could not send message to client " + Name + " because it disconnected");
             Console.WriteLine(ex);
         }
     }
 }
示例#8
0
 public override void PlayerKilled(GameMap gameMap)
 {
     if (_clientSocket.Connected)
     {
         try
         {
             var renderer = new ConsoleRender(gameMap);
             SocketHarnessMessage.SendMessage(_clientSocket, SocketHarnessMessage.MessageType.Killed, renderer.RenderTextGameState().ToString());
         }
         catch (Exception ex)
         {
             Console.WriteLine("Could not send message to client " + Name + " because it disconnected");
             Console.WriteLine(ex);
         }
     }
 }
示例#9
0
        public override void StartGame(GameMap gameState)
        {
            _gameMap = gameState;

            try
            {
                SocketHarnessMessage.SendMessage(_clientSocket, SocketHarnessMessage.MessageType.PlayerRegistered,
                                                 PlayerEntity.Key.ToString());
            }
            catch (Exception ex)
            {
                Console.WriteLine("Could not send message to client " + Name + " because it disconnected");
                Console.WriteLine(ex);
            }

            NewRoundStarted(_gameMap);
        }
示例#10
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);
            }
        }
示例#11
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");
        }
示例#12
0
        public override void NewRoundStarted(GameMap gameState)
        {
            var renderer = new ConsoleRender(gameState);

            if (_clientSocket.Connected)
            {
                try
                {
                    SocketHarnessMessage.SendMessage(_clientSocket, SocketHarnessMessage.MessageType.GameMap,
                                                     renderer.RenderTextGameState().ToString());
                }
                catch (Exception ex)
                {
                    Console.WriteLine("Could not send message to client " + Name + " because it disconnected");
                    Console.WriteLine(ex);
                }
            }
            else
            {
                PublishCommand(new DoNothingCommand());
            }
        }