Пример #1
0
        private void Server_DelimiterDataReceived(object sender, Message e)
        {
            string data = (Encoding.UTF8).GetString(e.Data);

            File.AppendAllText("log.txt", ((IPEndPoint)e.TcpClient.Client.RemoteEndPoint) + " sent : " + data + Environment.NewLine);

            Package       msg = JsonConvert.DeserializeObject <Package>(e.MessageString);
            Package       reply;
            Client        client = clients.First(c => { return(c.Value.tcpclient.IsEqual(e.TcpClient)); }).Value;
            Room          room   = FindRoomThatHaveClient(client);
            StringBuilder stringbuilder;

            if (msg.messages == Messages.Request)
            {
                switch (msg.commands)
                {
                //disconnect from the server
                case Commands.Disconnect:
                    reply = new Package(Messages.Success, Commands.Inform, "bye bye");
                    SendPackageToClient(client, reply);
                    Server_ClientDisconnected(this, client.tcpclient);
                    break;

                //send a private message to another client
                //package data content:
                //<receiver's clientID>|<message>
                case Commands.Message:
                    var datas = msg.data.Split('|');
                    //parse receiver clientid...
                    long clientID = 0;
                    long.TryParse(datas[0], out clientID);
                    Client receiver = FindClient(clientID);
                    //check if receiver is connected
                    if (receiver != null)
                    {
                        //send success to the client
                        SendPackageToClient(client, new Package(Messages.Success, Commands.Inform, ""));
                        //send the message to the receiver
                        SendPackageToClient(receiver, new Package(Messages.Request, Commands.Message, client.clientID + "|" + datas[1]));
                    }
                    else
                    {
                        //send fail to the client
                        SendPackageToClient(client, new Package(Messages.Fail, Commands.Inform, "There is no such client"));
                    }
                    break;

                //send a broadcast message to everyone who are in the same room as client
                //package data content:
                //<message>
                case Commands.Broadcast:
                    reply = new Package(Messages.Request, Commands.Message, client.clientID + "|" + msg.data);
                    //check if the client is not in the hall
                    if (hall.ContainClient(client))
                    {
                        //send the message to everyone in the hall
                        SendPackageToRoom(hall, reply);
                    }
                    else
                    {
                        //send the data to everyone in the same roomid
                        SendPackageToRoom(room, reply);
                    }
                    //return Success
                    //return Inform
                    //return data empty
                    SendPackageToClient(client, new Package(Messages.Success, Commands.Inform, ""));
                    break;

                //get the roomid list
                case Commands.GetRooms:
                    stringbuilder = new StringBuilder();
                    stringbuilder.Append(rooms.Count);
                    foreach (var kvp in rooms)
                    {
                        stringbuilder.Append("|" + kvp.Value.roomID);
                    }
                    reply = new Package(Messages.Success, Commands.Inform, stringbuilder.ToString());
                    SendPackageToClient(client, reply);
                    break;

                //get the roomid of the client
                //package data content:
                //<Empty>
                case Commands.GetRoomID:
                    //send the roomid to the client if the client is already in a room
                    reply = new Package(Messages.Success, Commands.Inform, client.roomID);
                    //and send that roomid to the client
                    //return Success
                    //return Inform
                    //return data = roomId
                    SendPackageToClient(client, reply);
                    break;

                //create a new room and move into it
                //package data content:
                //<Empty>
                case Commands.CreateRoom:
                    //create a new room
                    room = new Room();
                    rooms.Add(room.roomID, room);
                    //remove the client from the currently resided room
                    FindRoomThatHaveClient(client).RemoveClient(client);
                    //move client to the newly created room
                    room.AddClient(client);
                    reply = new Package(Messages.Success, Commands.Inform, room.roomID);
                    //check if the currently resided room is now empty

                    //and send that roomid to the client
                    SendPackageToClient(client, reply);
                    break;

                //join another room
                //package data content:
                //<roomID>
                case Commands.JoinRoom:
                    //parse roomID
                    long roomID = 0;
                    long.TryParse(msg.data, out roomID);
                    //check if that room exist
                    room = FindRoom(roomID);
                    if (room != null)
                    {
                        //remove the client from the currently resided room
                        FindRoomThatHaveClient(client).RemoveClient(client);
                        //add the client into that room
                        room.AddClient(client);
                        //check if the currently resided room is now empty
                        CheckAndClearEmptyRoom();

                        //return Success
                        //return Inform
                        //return data empty
                        reply = new Package(Messages.Success, Commands.Inform, "");
                    }
                    else
                    {
                        //return Fail
                        //return Inform
                        //return data = roomId
                        reply = new Package(Messages.Fail, Commands.Inform, "No such room!");
                    }
                    SendPackageToClient(client, reply);
                    break;

                //get the roomid list
                case Commands.GetClients:
                    stringbuilder = new StringBuilder();
                    stringbuilder.Append(room.clients.Count);
                    foreach (var kvp in room.clients)
                    {
                        stringbuilder.Append("|" + kvp.Value.clientID);
                    }
                    reply = new Package(Messages.Success, Commands.Inform, stringbuilder.ToString());
                    SendPackageToClient(client, reply);
                    break;

                //get the clientID of the client
                case Commands.GetClientID:
                    reply = new Package(Messages.Success, Commands.Inform, client.clientID);
                    SendPackageToClient(client, reply);
                    break;

                default:
                    break;
                }
            }

            PackageDataReceived?.Invoke(sender, new ServerEventArgs(client, msg));
        }
Пример #2
0
        private void Server_DelimiterDataReceived(object sender, Message e)
        {
            Package       msg = JsonConvert.DeserializeObject <Package>(e.MessageString);
            Package       reply;
            Client        client = clients.First(c => { return(c.Value.tcpclient.IsEqual(e.TcpClient)); }).Value;
            Room          room   = FindRoomThatHaveClient(client);
            StringBuilder stringbuilder;

            if (msg.messages == Messages.Request)
            {
                switch (msg.commands)
                {
                //disconnect from the server
                case Commands.Disconnect:
                    reply = new Package(Messages.Success, Commands.Inform, "bye bye");
                    SendPackageToClient(client, reply);
                    Server_ClientDisconnected(this, client.tcpclient);
                    break;

                //send a private message to another client
                //package data content:
                //<receiver's clientID>|<message>
                case Commands.Message:
                    var datas = msg.data.Split('|');
                    //parse receiver clientid...
                    Client receiver = FindClient(datas[0]);
                    reply = new Package(Messages.Success, Commands.Inform, "");

                    //send success to the client
                    SendPackageToClient(client, reply);

                    reply = new Package(Messages.Request, Commands.Message, client.clientID + "|" + datas[1] + "|" + receiver.clientID + "|" + datas[2]);

                    SendPackageToClient(client, reply);
                    //send the message to the receiver

                    SendPackageToClient(receiver, reply);

                    ////check if receiver is connected
                    //if (receiver != null)
                    //{
                    //    //send success to the client
                    //    SendPackageToClient(client, new Package(Messages.Success, Commands.Inform, ""));
                    //    //send the message to the receiver
                    //    SendPackageToClient(receiver, new Package(Messages.Request, Commands.Message, client.clientID + "|" + datas[1]));
                    //}
                    //else
                    //{
                    //    //send fail to the client
                    //    SendPackageToClient(client, new Package(Messages.Fail, Commands.Inform, "There is no such client"));
                    //}
                    break;

                //send a broadcast message to everyone who are in the same room as client
                //package data content:
                //<message>
                case Commands.Broadcast:
                    reply = new Package(Messages.Request, Commands.Message, client.clientID + "|" + msg.data);
                    //check if the client is not in the hall
                    if (hall.ContainClient(client))
                    {
                        //send the message to everyone in the hall
                        SendPackageToRoom(hall, reply);
                    }
                    else
                    {
                        //send the data to everyone in the same roomid
                        SendPackageToRoom(room, reply);
                    }
                    //return Success
                    //return Inform
                    //return data empty
                    SendPackageToClient(client, new Package(Messages.Success, Commands.Inform, ""));
                    break;

                //get the roomid list
                case Commands.GetRooms:
                    stringbuilder = new StringBuilder();
                    stringbuilder.Append(rooms.Count);
                    foreach (var kvp in rooms)
                    {
                        stringbuilder.Append("|" + kvp.Value.roomID);
                    }
                    reply = new Package(Messages.Success, Commands.Inform, stringbuilder.ToString());
                    SendPackageToClient(client, reply);
                    break;

                //get the roomid of the client
                //package data content:
                //<Empty>
                case Commands.GetRoomID:
                    //send the roomid to the client if the client is already in a room
                    reply = new Package(Messages.Success, Commands.Inform, client.roomID);
                    //and send that roomid to the client
                    //return Success
                    //return Inform
                    //return data = roomId
                    SendPackageToClient(client, reply);
                    break;

                //create a new room and move into it
                //package data content:
                //<Empty>
                case Commands.CreateRoom:
                    //create a new room
                    room = new Room();
                    rooms.Add(room.roomID, room);
                    //remove the client from the currently resided room
                    FindRoomThatHaveClient(client).RemoveClient(client);
                    //move client to the newly created room
                    room.AddClient(client);
                    reply = new Package(Messages.Success, Commands.Inform, room.roomID);
                    //and send that roomid to the client
                    SendPackageToClient(client, reply);
                    break;

                //join another room
                //package data content:
                //<roomID>
                case Commands.JoinRoom:
                    //check if that room exist
                    room = FindRoom(msg.data);
                    if (room != null)
                    {
                        //remove the client from the currently resided room
                        FindRoomThatHaveClient(client).RemoveClient(client);
                        //add the client into that room
                        room.AddClient(client);
                        //return Success
                        //return Inform
                        //return data empty
                        reply = new Package(Messages.Success, Commands.Inform, "");
                    }
                    else
                    {
                        //return Fail
                        //return Inform
                        //return data = roomId
                        reply = new Package(Messages.Fail, Commands.Inform, "No such room!");
                    }
                    SendPackageToClient(client, reply);
                    break;

                //get the roomid list
                case Commands.GetClients:
                    stringbuilder = new StringBuilder();
                    stringbuilder.Append(room.clients.Count);
                    foreach (var kvp in room.clients)
                    {
                        stringbuilder.Append("|" + kvp.Value.clientID);
                    }
                    reply = new Package(Messages.Success, Commands.Inform, stringbuilder.ToString());
                    SendPackageToClient(client, reply);
                    break;

                //get the clientID of the client
                case Commands.GetClientID:
                    reply = new Package(Messages.Success, Commands.Inform, client.clientID);
                    SendPackageToClient(client, reply);
                    break;

                //Set nickname
                case Commands.SetNickName:
                    client.NickName = msg.data;
                    reply           = new Package(Messages.Success, Commands.Inform, string.Empty);
                    SendPackageToClient(client, reply);

                    stringbuilder = new StringBuilder();    //xay dung string
                    foreach (var kvp in clients)
                    {
                        stringbuilder.Append("|" + kvp.Key + "|" + kvp.Value.NickName);    //them duoi key va nickname vo chuoi tra ve
                    }
                    reply = new Package(Messages.Request, Commands.Message, "server|clientlist|" + clients.Count + stringbuilder.ToString());
                    SendPackageToRoom(room, reply);    //gui cho nhung client chung phong
                    break;

                //Get nickname
                case Commands.GetNickName:
                    //parse receiver clientid...
                    Client receiverr = FindClient(msg.data);
                    //check if receiver is connected
                    if (receiverr != null)
                    {
                        //send success to the client
                        SendPackageToClient(client, new Package(Messages.Success, Commands.Inform, receiverr.NickName));
                    }
                    else
                    {
                        //send fail to the client
                        SendPackageToClient(client, new Package(Messages.Fail, Commands.Inform, "There is no such client"));
                    }
                    break;
                //



                default:
                    break;
                }
            }

            PackageDataReceived?.Invoke(sender, new ServerEventArgs(client, msg));
        }