Example #1
0
        public Packet TCPRead()
        {
            lock (_readLock)
            {
                try
                {
                    int numberOfBytes;
                    if ((numberOfBytes = _reader.ReadInt32()) != -1)
                    {
                        byte[] buffer = _reader.ReadBytes(numberOfBytes);

                        MemoryStream memoryStream = new MemoryStream(buffer);
                        Packet       packet       = _binaryFormatter.Deserialize(memoryStream) as Packet;

                        //decrypt relevant packets
                        switch (packet.EPacketType)
                        {
                        case PacketType.CHATMESSAGE:
                            ChatMessagePacket chatMessagePacket = (ChatMessagePacket)packet;
                            return(new ChatMessagePacket(Decrypt(chatMessagePacket.OriginClient), Decrypt(chatMessagePacket.Message)));

                        case PacketType.COMMANDMESSAGE:
                            CommandMessagePacket commandMessagePacket = (CommandMessagePacket)packet;
                            return(new CommandMessagePacket(Decrypt(commandMessagePacket.Message)));

                        case PacketType.CLIENTNAME:
                            ClientNamePacket clientNamePacket = (ClientNamePacket)packet;
                            return(new ClientNamePacket(Decrypt(clientNamePacket.ClientName)));
                        }

                        return(packet);
                    }
                    else
                    {
                        return(null);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine("[Error] " + e.Message + e.StackTrace);
                    return(null);
                }
            }
        }
        public void SetNickname(string nickname)
        {
            if (nickname.Length >= 3 && !nickname.Contains(" ") && nickname.Length <= 11)
            {
                ClientNamePacket clientNamePacket = new ClientNamePacket(EncryptString(nickname));
                TCPSerialize(clientNamePacket);
                return;
            }

            //check if it is too over 10 characters
            if (nickname.Length > 11)
            {
                _clientForm.UpdateChatWindow("[Error] Your nickname cannot be longer than 11 characters!");
                _clientForm.Nickname.Focus();
            }

            //check if it has spaces
            if (nickname.Contains(" "))
            {
                _clientForm.UpdateChatWindow("[Error] Your nickname cannot have spaces!");
                _clientForm.Nickname.Focus();
            }

            //check if nickname is too small or not inputted
            if (nickname.Length < 3 && nickname != "")
            {
                _clientForm.UpdateChatWindow("[Error] Your nickname must be atleast 3 characters long!");
                _clientForm.Nickname.Focus();
            }
            else if (nickname == "")
            {
                _clientForm.UpdateChatWindow("[Error] Please enter a nickname!");
                _clientForm.Nickname.Focus();
            }

            _clientForm.Nickname.Focus();
        }
        private void TcpProcessServerResponse()
        {
            try
            {
                int numberOfBytes;
                while ((numberOfBytes = m_Reader.ReadInt32()) != -1)
                {
                    byte[]       buffer       = m_Reader.ReadBytes(numberOfBytes);
                    MemoryStream memoryStream = new MemoryStream(buffer);
                    Packet       packet       = m_Formatter.Deserialize(memoryStream) as Packet;

                    switch (packet.packetType)
                    {
                    case PacketType.CHATMESSAGE:
                        ChatMessagePacket chatMessage = (ChatMessagePacket)packet;
                        m_clientForm.UpdateChatWindow(chatMessage.message);
                        break;

                    case PacketType.PRIVATEMESSAGE:
                        break;

                    case PacketType.CLIENTNAME:
                        ClientNamePacket clientName = (ClientNamePacket)packet;
                        m_clientForm.UpdatePeopleList(clientName.name);
                        break;

                    default:
                        break;
                    }
                }
            }
            catch (SocketException e)
            {
                Console.WriteLine("Client TCP Read Method exception: " + e.Message);
            }
        }
Example #4
0
        void TcpClientMethod(int index)
        {
            Console.WriteLine("Socket opened. (" + _tcpListener.ToString() + ")");

            Packet receivedPacket;
            Client client = _clients[index];

            try {
                while ((receivedPacket = client.TcpRead()) != null)
                {
                    Console.Write("TCP Receieved: ");

                    // act on packet type
                    switch (receivedPacket._packetType)
                    {
                    case Packet.PacketType.EMPTY:
                        Console.WriteLine("EMPTY");

                        /* do nothing */
                        break;

                    case Packet.PacketType.CHATMESSAGE:
                        Console.WriteLine("CHAT");

                        TcpRespondToAll((ChatMessagePacket)receivedPacket, client);

                        break;

                    case Packet.PacketType.PRIVATEMESSAGE:
                        Console.WriteLine("PRIVATE");

                        TcpRespondTo((PrivateMessagePacket)receivedPacket, client);

                        break;

                    case Packet.PacketType.SERVERMESSAGE:
                        Console.WriteLine("SERVER");

                        ServerMessagePacket servPacket = (ServerMessagePacket)receivedPacket;
                        servPacket._messageRecv = GetReturnMessage(servPacket._messageSent);
                        client.TcpSend(servPacket);

                        break;

                    case Packet.PacketType.CLIENTNAME:
                        Console.WriteLine("NAME");

                        ClientNamePacket namePacket = (ClientNamePacket)receivedPacket;
                        // create message
                        namePacket._message = client._name + " changed name to " + namePacket._name;

                        // change name
                        client._name = namePacket._name;

                        // update client
                        client.TcpSend(namePacket);

                        // notify all clients
                        TcpRespondToAll(new ChatMessagePacket(namePacket._message), client);

                        break;

                    case Packet.PacketType.LOGIN:
                        Console.WriteLine("LOGIN");

                        LoginPacket loginPacket = (LoginPacket)receivedPacket;
                        client._endPoint       = loginPacket._endPoint;
                        loginPacket._serverKey = client.UpdateRSA(loginPacket);

                        client.TcpSend(loginPacket);

                        break;

                    case Packet.PacketType.SECUREMESSAGE:
                        Console.WriteLine("SECURE");

                        // receive packet
                        SecurePacket safePacket = (SecurePacket)receivedPacket;

                        // transmit packet
                        TcpSecureRespondToAll(
                            client.GetSecureMessage(safePacket),
                            safePacket._packetSrc
                            );

                        break;

                    case Packet.PacketType.ERROR:
                        //should be for other things, in another place
                        Console.WriteLine("ERROR");

                        ErrorMessagePacket errPacket = (ErrorMessagePacket)receivedPacket;
                        client.TcpSend(errPacket);
                        break;

                    case Packet.PacketType.ENDSESSION:
                        Console.Write("ENDING TCP SESSION: " + client._name);

                        // signal to client to close connections
                        // and end while loop
                        client.Close();

                        break;

                    case Packet.PacketType.JOINGAME:
                        Console.Write("JOIN GAME - ");
                        JoinGamePacket joinGame = (JoinGamePacket)receivedPacket;
                        Client         host     = null;

                        foreach (Client user in _clients.Values)
                        {
                            if (user._name == joinGame._targetHost)
                            {
                                host = user;
                            }
                        }

                        //ChatMessagePacket resultPacket = null;

                        if (GameSession.Instance.JoinSession(ref client, host))
                        {
                            Console.WriteLine("JOINED A GAME");

                            //success - msg client
                            PrivateMessagePacket resultPacket =
                                new PrivateMessagePacket(client._name, "Started Game Session")
                            {
                                _packetSrc = _serverName
                            };
                            TcpRespondTo(resultPacket, client);

                            //launch client's game
                            client.TcpSend(joinGame);
                        }
                        else
                        {
                            Console.WriteLine("FAILED TO JOIN A GAME");
                            //failed - msg client
                        };

                        break;

                    case Packet.PacketType.USERLIST:
                        Console.WriteLine("USERLIST");
                        UserListPacket userList = (UserListPacket)receivedPacket;

                        if (userList._users == null)
                        {
                            List <string> usernames = new List <string>();

                            // collect user names
                            foreach (KeyValuePair <int, Client> c in _clients)
                            {
                                usernames.Add(c.Value._name);
                            }

                            userList._users = usernames.ToArray();

                            TcpSendToAll(userList);
                        }
                        // if list is filled, why is it here?!

                        break;

                    case Packet.PacketType.LEAVEGAME:
                        LeaveGamePacket leaveGame = (LeaveGamePacket)receivedPacket;

                        // check game sessions
                        bool wasHost = GameSession.Instance.IsHosting(client);

                        // update game session
                        List <string> players = GameSession.Instance.LeaveSession(ref client);

                        ServerMessagePacket serverMessage = null;

                        if (!leaveGame._wasForced)
                        {
                            serverMessage = new ServerMessagePacket
                                                (client._name + " has left the game.", null);
                        }
                        else
                        {
                            serverMessage = new ServerMessagePacket
                                                ("GAME ERROR: " + client._name + " was forced to leave the game.", null);
                        }

                        foreach (Client user in _clients.Values)
                        {
                            if (players.Contains(user._name))
                            {
                                user.TcpSend(serverMessage);
                            }
                        }

                        if (wasHost)
                        {
                            leaveGame._wasForced = true;

                            foreach (Client user in _clients.Values)
                            {
                                user.TcpSend(leaveGame);
                            }
                        }

                        break;

                    default:
                        break;
                    }
                }
            } catch (Exception e) {
                Console.WriteLine("Error: " + e.Message);
                if (client != null)
                {
                    Console.WriteLine("Client: " + client._name);
                }
            }

            client.Close();
            _clients.TryRemove(index, out client);
        }
        private void TCPClientMethod(int index)
        {
            Packet receivedPacket;
            
            //loop to allow continuous communication
            while((receivedPacket = _clients[index].TCPRead()) != null)
            {
                try
                {
                    switch (receivedPacket.EPacketType)
                    {
                        case PacketType.EMPTY:
                            EmptyPacket emptyPacket = (EmptyPacket)receivedPacket;
                            break;


                        case PacketType.CHATMESSAGE:
                            ChatMessagePacket chatMessagePacket = (ChatMessagePacket)receivedPacket;
                            try
                            {
                                //reencrypt data into new packet so that all the clients are able to decrypt it with their private key
                                ChatMessagePacket sendPacket = new ChatMessagePacket(UTF8.GetBytes(_clients[index].clientData.clientNickname), chatMessagePacket.Message)
                                {
                                    Time = chatMessagePacket.Time
                                };

                                //send messages to all clients
                                TCPSendPacketToAll(sendPacket);

                                //print client messages to server console
                                OutputLog(chatMessagePacket.Time + " " + _clients[index].clientData.clientNickname + ": " + UTF8.GetString(chatMessagePacket.Message));
                            }
                            catch (Exception e)
                            {
                                OutputLog("[Error] " + e.Message + e.StackTrace);
                                break;
                            }
                            break;

                        case PacketType.COMMANDMESSAGE:
                            CommandMessagePacket commandMessagePacket = (CommandMessagePacket)receivedPacket;

                            //Process command
                            ProcessCommand(_clients[index], UTF8.GetString(commandMessagePacket.Message));
                            break;


                        case PacketType.CLIENTNAME:
                            ClientNamePacket clientNamePacket = (ClientNamePacket)receivedPacket;

                            bool uniqueName = true;

                            for(int i = 0; i < _clients.Count; i++)
                            {
                                if(UTF8.GetString(clientNamePacket.ClientName) == _clients[i].clientData.clientNickname)
                                {
                                    uniqueName = false;
                                }
                            }

                            if(uniqueName)
                            {
                                OutputLog("[Nickname] " + _clients[index].clientData.clientNickname + " has changed their nickname to " + UTF8.GetString(clientNamePacket.ClientName) + ".");
                                _clients[index].clientData.clientNickname = UTF8.GetString(clientNamePacket.ClientName);

                                //Refresh client list
                                ClientListPacket clientListPacket = new ClientListPacket(GetClientNames(), GetClientAddresses());
                                TCPSendPacketToAll(clientListPacket);

                                //Send name change confirmation
                                ServerMessagePacket serverMessagePacket = new ServerMessagePacket(UTF8.GetBytes("Your server nickname has been changed to " + UTF8.GetString(clientNamePacket.ClientName) + "!"));
                                _clients[index].TCPSend(serverMessagePacket);
                            }
                            else
                            {
                                //Send name change failed
                                ServerMessagePacket serverMessagePacket = new ServerMessagePacket(UTF8.GetBytes("Someone on this server already has the nickname '" + UTF8.GetString(clientNamePacket.ClientName) + "'. Please choose a different nickname!"));
                                _clients[index].TCPSend(serverMessagePacket);
                            }

                            break;


                        case PacketType.DISCONNECTREQUEST:
                            DisconnectRequestPacket disconnectRequestPacket = (DisconnectRequestPacket)receivedPacket;
                            //Announce client has joined to all clients
                            ServerMessagePacket serverMessagePacket3 = new ServerMessagePacket(UTF8.GetBytes(_clients[index].clientData.clientNickname + " has left the server!"));
                            TCPSendPacketToAll(serverMessagePacket3);
                            _clients[index].Close();
                            break;


                        case PacketType.LOGIN:
                            LoginPacket loginPacket = (LoginPacket)receivedPacket;
                            try
                            {
                                //set server client ip and client key
                                _clients[index].clientData.ipEndPoint = loginPacket.EndPoint;
                                _clients[index]._clientKey = loginPacket.PublicKey;

                                //send server public key back
                                ServerKeyPacket serverKeyPacket = new ServerKeyPacket(_clients[index]._publicKey, true);
                                _clients[index].TCPSend(serverKeyPacket);
                                _clients[index].successfulLogin = true;

                                //Announce client has joined to all clients
                                ServerMessagePacket serverMessagePacket2 = new ServerMessagePacket(UTF8.GetBytes(_clients[index].clientData.clientNickname + " has joined the server!"));
                                TCPSendPacketToAll(serverMessagePacket2);

                                //Refresh client list
                                ClientListPacket clientListPacket2 = new ClientListPacket(GetClientNames(), GetClientAddresses());
                                TCPSendPacketToAll(clientListPacket2);
                                break;
                            }
                            catch (Exception e)
                            {
                                OutputLog("[Error] " + e.Message + e.StackTrace);
                                break;
                            }
                    }
                }
                catch (Exception e)
                {
                    OutputLog("[Error] " + e.Message + e.StackTrace);
                    break;
                }
            }

            try
            {
                _clients[index].Close();
                //Take client out of client ConcurrentBag
                _clients.TryRemove(index, out Client c);
            }
            catch (Exception e)
            {
                OutputLog("[Error] " + e.Message + e.StackTrace);
            }
        }
Example #6
0
        private void TcpProcessServerPacket()
        {
            Packet packet = new Packet();

            while (_net.IsTcpConnected)
            {
                packet = _net.TcpReadPacket();

                Debug("TcpProcessServerPacket: packet = " + packet);

                if (packet != null)
                {
                    switch (packet._packetType)
                    {
                    case Packet.PacketType.EMPTY:
                        /* do nothing */
                        break;

                    case Packet.PacketType.CLIENTNAME:
                        ClientNamePacket namePacket = (ClientNamePacket)packet;

                        _win.name = namePacket._name;
                        _nick     = namePacket._name;

                        break;

                    case Packet.PacketType.CHATMESSAGE:
                        ChatMessagePacket chatPacket = (ChatMessagePacket)packet;
                        _win.UpdateChat(chatPacket._message);

                        break;

                    case Packet.PacketType.PRIVATEMESSAGE:
                        PrivateMessagePacket privPacket = (PrivateMessagePacket)packet;
                        _win.UpdateChat(privPacket._packetSrc + ": " + privPacket._message);

                        break;

                    case Packet.PacketType.LOGIN:
                        Console.WriteLine("Logged in to server.");
                        _net.TcpFinishLogin((LoginPacket)packet);

                        break;

                    case Packet.PacketType.SECUREMESSAGE:
                        SecurePacket safePacket = (SecurePacket)packet;
                        _win.UpdateChat(
                            "Secure Message Received [" + safePacket._packetSrc + "]: " +
                            _net.DecryptString(safePacket._data)
                            );

                        break;

                    case Packet.PacketType.ENDSESSION:
                        Console.WriteLine("Disconnecting from server.");
                        _net.Close();

                        break;

                    case Packet.PacketType.JOINGAME:
                        _win.StartGame(this);

                        break;

                    case Packet.PacketType.USERLIST:
                        UserListPacket userList = (UserListPacket)packet;
                        _win.UserList = userList._users;

                        break;

                    case Packet.PacketType.LEAVEGAME:
                        LeaveGamePacket leaveGame = (LeaveGamePacket)packet;
                        if (leaveGame._wasForced)
                        {
                            _win.StopGame();
                        }
                        break;

                    case Packet.PacketType.SERVERMESSAGE:
                        ServerMessagePacket serverMessage = (ServerMessagePacket)packet;
                        _win.UpdateChat(serverMessage._messageSent);
                        break;
                    }
                }
            }
        }