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; } }
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(); }