예제 #1
0
        public void SendMessageToKnownServer(string message)
        {
            try
            {
                if (string.IsNullOrEmpty(message))
                {
                    return;
                }

                ChatPacket packet = new ChatPacket();
                packet.Message = message;
                if (string.IsNullOrEmpty(nickname))
                {
                    packet.PacketType = PACKET_TYPE.SETUP;
                    packet.Nickname   = string.Empty;
                }
                else
                {
                    packet.PacketType = PACKET_TYPE.TEXT;
                    packet.Nickname   = nickname;
                }

                string jsonPacket = JsonConvert.SerializeObject(packet);

                var bytesToSend           = Encoding.UTF8.GetBytes(jsonPacket);
                SocketAsyncEventArgs args = new SocketAsyncEventArgs();
                args.SetBuffer(bytesToSend, 0, bytesToSend.Length);
                args.RemoteEndPoint = mChatServerEP;
                args.UserToken      = packet;
                args.Completed     += SendMessageToKnownServerCompleted;
                mBroadcastSender.SendToAsync(args);
            }
            catch (Exception e)
            {
                OnRaisePrintStringEvent(new PrintStringEventArgs($"Error: {e.ToString()}"));
                throw;
            }
        }
예제 #2
0
        private void ReceiveCompletedCallback(object sender, SocketAsyncEventArgs e)
        {
            string textReceived = Encoding.UTF8.GetString(e.Buffer, 0, e.BytesTransferred);

            ChatPacket packet = JsonConvert.DeserializeObject <ChatPacket>(textReceived);

            packet.Message = packet.Message.Trim();

            if (packet.PacketType == PACKET_TYPE.DISCOVERY && packet.Message.Equals("<DISCOVER>"))
            {
                if (!mListOfClients.ContainsValue(e.RemoteEndPoint))
                {
                    mListOfClients.Add(e.RemoteEndPoint.ToString(), e.RemoteEndPoint);

                    OnRaisePrintStringEvent(new PrintStringEventArgs($"New client connected: {e.RemoteEndPoint.ToString()}"));

                    ChatPacket confirmationPacket = new ChatPacket();
                    confirmationPacket.Message    = "Inform your nickname";
                    confirmationPacket.PacketType = PACKET_TYPE.CONFIRMATION;
                    confirmationPacket.Nickname   = "Server";

                    SendTextToEndPoint(JsonConvert.SerializeObject(confirmationPacket), e.RemoteEndPoint);
                }
            }
            else if (packet.PacketType == PACKET_TYPE.SETUP)
            {
                string choosenNickname = packet.Message;
                if (mListOfClients.ContainsKey(choosenNickname))
                {
                    packet.Message    = "The choosen nickname already exists. Please choose another one";
                    packet.PacketType = PACKET_TYPE.SETUP_ERROR;
                    SendTextToEndPoint(JsonConvert.SerializeObject(packet), e.RemoteEndPoint);
                }
                else
                {
                    mListOfClients.Remove(e.RemoteEndPoint.ToString());
                    mListOfClients.Add(choosenNickname, e.RemoteEndPoint);
                    packet.Message    = "Welcome to the chat";
                    packet.PacketType = PACKET_TYPE.SETUP_CONFIRMATION;
                    packet.Nickname   = choosenNickname;
                    SendTextToEndPoint(JsonConvert.SerializeObject(packet), e.RemoteEndPoint);
                }
            }
            else if (packet.PacketType == PACKET_TYPE.TEXT)
            {
                if (packet.Message.StartsWith("/help"))
                {
                    packet.Nickname = "Server";
                    packet.Message  = $"To send a message to someone start the message with a @ followed by the nickname (e.g.: @paulo Oi){Environment.NewLine}To send a private message to someone start the message with a # followed by the nickname (e.g.: #paulo essa mensagem é só pra você){Environment.NewLine}";
                    SendTextToEndPoint(JsonConvert.SerializeObject(packet), e.RemoteEndPoint);
                }
                else if (packet.Message.StartsWith("@"))
                {
                    string targetNick = packet.Message.Substring(0, packet.Message.IndexOf(' ')).Replace("@", "");
                    if (mListOfClients.ContainsKey(targetNick))
                    {
                        packet.Nickname += $" says to {targetNick}";
                        packet.Message   = packet.Message.Remove(0, packet.Message.IndexOf(' '));
                        SendToAll(JsonConvert.SerializeObject(packet));
                    }
                    else
                    {
                        packet.Nickname = "Server";
                        packet.Message  = "User not found on this room";
                        SendTextToEndPoint(JsonConvert.SerializeObject(packet), e.RemoteEndPoint);
                    }
                }
                else if (packet.Message.Trim().StartsWith("#"))
                {
                    string targetNick = packet.Message.Substring(0, packet.Message.IndexOf(' ')).Replace("#", "");
                    if (mListOfClients.ContainsKey(targetNick))
                    {
                        packet.Nickname += $" privately says to {targetNick}";
                        packet.Message   = packet.Message.Remove(0, packet.Message.IndexOf(' '));
                        SendTextToEndPoint(JsonConvert.SerializeObject(packet), e.RemoteEndPoint);
                        SendTextToEndPoint(JsonConvert.SerializeObject(packet), mListOfClients[targetNick]);
                    }
                    else
                    {
                        packet.Nickname = "Server";
                        packet.Message  = "User not found on this room";
                        SendTextToEndPoint(JsonConvert.SerializeObject(packet), e.RemoteEndPoint);
                    }
                }
                else
                {
                    SendToAll(textReceived);
                }
            }
            StartReceivingData();
        }