public async void StartServer() { // Start listener which accepts connections on the specific port TcpListener listener = new TcpListener(IPAddress.Any, _port); listener.Start(); LogMessage("Start listening..."); while (_isListening) { // Wait for a connection TcpClient clientSocket = await listener.AcceptTcpClientAsync(); LogMessage("New Client accepted"); // Wrap this socket into a specific class which handles requests AcceptedClient client = new AcceptedClient(clientSocket, this); client.SendWelcomeMessage(); client.Name = GetTemporaryClientName(); // Start thread for handling requests and messages Thread clientThread = new Thread(client.WaitForRequest); client.CurrentThread = clientThread; clientThread.Start(); } }
public void BroadcastMessage(AcceptedClient xSender, string xMessage) { string message = $"-> {xSender.Name}: {xMessage}"; foreach (var iiClient in _clients.Where(x => x.Key.Equals(xSender.Name) == false)) { iiClient.Value.WriteMessage(message); } }
private static void OnClientConnected(object sender, ClientConnectedEventArgs args) { Console.WriteLine($"Client '{args.Socket.RemoteEndPoint}' connected"); var acceptedClient = new AcceptedClient(args.Socket); acceptedClient.ClientDisconnected += OnClientDisconnected; acceptedClient.Start(); }
public void HandleCommand(AcceptedClient xClient, string xMessage) { string command = xMessage.Split(' ')[0].ToLower(); string message = ""; string target = ""; switch (command) { case "/help": message = CommandHandler.GetHelpMessage(); xClient.WriteMessage(message); break; case "/getuser": message = CommandHandler.GetUserMessage(_clients.Keys.ToList()); xClient.WriteMessage(message); break; case "/login": string username = CommandHandler.ExtractUsernameFromLogin(xMessage); if (xClient.IsLoggedIn) { message = CommandHandler.GetErrorAlreadyLoggedIn(); xClient.WriteMessage(message); } else if (IsUsernameValid(username) == false) { message = CommandHandler.GetErrorUsernameNotAllowed(username); xClient.WriteMessage(message); } else if (_clients.ContainsKey(username)) { message = CommandHandler.GetErrorUserExisting(); xClient.WriteMessage(message); } else { _clients.Add(username, xClient); xClient.IsLoggedIn = true; xClient.Name = username; message = CommandHandler.GetLoginConfirmedMessage(username); xClient.WriteMessage(message); } break; case "/whisper": string messageTarget = CommandHandler.ExtractWhisperMessage(xClient.Name, xMessage, out target); if (string.IsNullOrWhiteSpace(target) || string.IsNullOrWhiteSpace(messageTarget)) { message = CommandHandler.GetErrorCommandNotRecognized(); xClient.WriteMessage(message); } else if (_clients.ContainsKey(target) == false) { message = CommandHandler.GetErrorUserNotExisting(target); xClient.WriteMessage(message); } else { message = CommandHandler.GetWhisperConfirmed(target); _clients[target].WriteMessage(messageTarget); xClient.WriteMessage(message); } break; case "/logoff": xClient.IsLoggedIn = false; xClient.WriteMessage("Logoff received. You're logged off from the server!"); _clients.Remove(xClient.Name); xClient.StopClient(); break; default: message = CommandHandler.GetErrorCommandNotRecognized(); xClient.WriteMessage(message); break; } }