예제 #1
0
        public void SendClientList(List <string> clientList)
        {
            Packet p = new UserListPacket(clientList);

            for (int i = 0; i < this.clientList.Count; i++)
            {
                this.clientList[i].TCPSend(p);
            }
        }
예제 #2
0
        void SendClientList()
        {
            List <string> userList = new List <string>();

            foreach (KeyValuePair <int, Client> cli in clients)
            {
                userList.Add(cli.Value.name);
            }

            UserListPacket userListPacket = new UserListPacket(userList);

            foreach (KeyValuePair <int, Client> cli in clients)
            {
                cli.Value.Send(userListPacket);
            }
        }
예제 #3
0
        private void ProcessServerResponse()
        {
            int byteNum;

            try
            {
                while (connected)
                {
                    if ((byteNum = reader.ReadInt32()) != 0)
                    {
                        byte[]       buffer    = reader.ReadBytes(byteNum);
                        MemoryStream memstream = new MemoryStream(buffer);

                        Packet packet = formatter.Deserialize(memstream) as Packet;

                        switch (packet.packetType)
                        {
                        case PacketType.ChatMessage:
                            ChatMessagePacket chatPacket = (ChatMessagePacket)packet;
                            clientForm.UpdateChatWindow(chatPacket.message);
                            break;

                        case PacketType.UserListPacket:
                            UserListPacket listPacket = (UserListPacket)packet;
                            clientForm.UserListBox_Edit(listPacket.userList);
                            break;

                        case PacketType.PrivateMessage:
                            PrivateMessagePacket msgPacket = (PrivateMessagePacket)packet;
                            clientForm.OpenPrivateMessage(msgPacket.sender, msgPacket.message);
                            break;
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
예제 #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);
        }
예제 #5
0
        private void GetUserList()
        {
            UserListPacket userList = new UserListPacket(null);

            _client.Send(userList);
        }
예제 #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;
                    }
                }
            }
        }
예제 #7
0
        private void HandlePacket(Packet packetFromServer)
        {
            switch (packetFromServer.type)
            {
            case PacketType.GAME:
                GamePacket pGamePacket = (GamePacket)packetFromServer;
                int        selection   = UpdateButtons(pGamePacket.x, pGamePacket.y);
                switch (selection)
                {
                case 1:
                    noughtsAndCrosses.button1.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button1.Text    = pGamePacket.text;
                        noughtsAndCrosses.button1.Enabled = false;
                    }));
                    break;

                case 2:
                    noughtsAndCrosses.button2.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button2.Text    = pGamePacket.text;
                        noughtsAndCrosses.button2.Enabled = false;
                    }));
                    break;

                case 3:
                    noughtsAndCrosses.button3.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button3.Text    = pGamePacket.text;
                        noughtsAndCrosses.button3.Enabled = false;
                    }));
                    break;

                case 4:
                    noughtsAndCrosses.button4.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button4.Text    = pGamePacket.text;
                        noughtsAndCrosses.button4.Enabled = false;
                    }));
                    break;

                case 6:
                    noughtsAndCrosses.button6.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button6.Text    = pGamePacket.text;
                        noughtsAndCrosses.button6.Enabled = false;
                    }));
                    break;

                case 7:
                    noughtsAndCrosses.button7.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button7.Text    = pGamePacket.text;
                        noughtsAndCrosses.button7.Enabled = false;
                    }));
                    break;

                case 8:
                    noughtsAndCrosses.button8.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button8.Text    = pGamePacket.text;
                        noughtsAndCrosses.button8.Enabled = false;
                    }));
                    break;

                case 9:
                    noughtsAndCrosses.button9.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button9.Text    = pGamePacket.text;
                        noughtsAndCrosses.button9.Enabled = false;
                    }));
                    break;

                case 10:
                    noughtsAndCrosses.button10.Invoke(new MethodInvoker(delegate()
                    {
                        noughtsAndCrosses.button10.Text    = pGamePacket.text;
                        noughtsAndCrosses.button10.Enabled = false;
                    }));
                    break;
                }
                break;

            case PacketType.CHATMESSAGE:
                ChatMessagePacket messagePacket = (ChatMessagePacket)packetFromServer;
                _form.UpdateChatWindow(messagePacket.message);
                break;

            case PacketType.NICKNAME:
                NickNamePacket nicknamePacket = (NickNamePacket)packetFromServer;
                _form.UpdateChatWindow(nicknamePacket.nickName);
                break;

            case PacketType.ENDPOINT:
                LoginPacket serverLogInDetails = (LoginPacket)packetFromServer;
                _udpClient.Connect((IPEndPoint)serverLogInDetails.endPoint);

                _udpReaderThread = new Thread(UDPRead);
                _udpReaderThread.Start();
                break;

            case PacketType.USERLIST:
                UserListPacket userListPacket = (UserListPacket)packetFromServer;
                nicknameList = userListPacket.userList;

                _form.UpdateClientListBox(userListPacket.userList);
                break;

            case PacketType.GAMEREQ:
                GameRequestPacket gameReqPacket = (GameRequestPacket)packetFromServer;
                int packetState = (int)gameReqPacket.requestState;
                switch (packetState)
                {
                case 0:
                    _form.UpdateChatWindow("Game was declined!");
                    break;

                case 1:
                    gameRecipient = gameReqPacket.recipient;
                    gameSender    = gameReqPacket.sender;
                    _form.UpdateChatWindow("Game accepted!");
                    RequestGame(gameReqPacket.sender, 1, gameReqPacket.recipient);
                    noughtsAndCrosses.Text = _form.clientNickName;
                    noughtsAndCrosses.ShowDialog();
                    break;

                case 2:
                    _form.CreateMessageBox(gameReqPacket.sender, gameReqPacket.recipient);
                    break;
                }
                break;
            }
        }