Esempio n. 1
0
        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();
            }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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();
        }
Esempio n. 4
0
        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;
            }
        }