protected override void HandleClient(ClientDialog client) { try { while (true) { Message request = client.ReceiveMessage(); switch (request.Title) { case "AUTHENTICATE": if (UserConfiguration.LoginDataMatch((LoginUserData)request.Payload["LoginData"])) { client.Username = ((LoginUserData)request.Payload["LoginData"]).Username; } break; case "MESSAGE": string[] receivers_usernames = (string[])request.Payload["Receivers"]; ClientDialog[] receivers = new ClientDialog[receivers_usernames.Length]; for (int i = 0; i < receivers.Length; i++) { for (int j = 0; j < this.clients.Count; j++) { if (receivers_usernames[i] == this.clients[j].Username) { this.clients[j].SendMessage("MESSAGE", ("Sender", client.Username), ("Content", request.Payload["Message"])); } } } break; case "EXPECT": /*if (this.expectant == null) this.expectant = client; * else * { * this.expectant.SendMessage("MESSAGE", ("Sender", client.Username), ("Content", request.Payload["Message"])); * this.expectant = null; * } * break;*/ case "UNEXPECT": //if (this.expectant == client) this.expectant = null; break; case "DISCONNECT": client.Dispose(); throw new SocketException(); } } } catch (SocketException) { this.clients.Remove(client); } }
protected override void HandleClient(ClientDialog client) { IPEndPoint remoteIPEndPoint = client.Socket.RemoteEndPoint as IPEndPoint; Console.WriteLine($"Connection request from {client.IPEndPoint.Address}:{client.IPEndPoint.Port} has been accepted"); UserConfiguration userConfiguration = new UserConfiguration(client); try { while (true) { Message request = client.ReceiveMessage(); switch (request.Title) { case "SIGNUP": userConfiguration.SignUp((EditableUserData)request.Payload["EditableData"]); break; case "LOGIN": userConfiguration.LogIn((LoginUserData)request.Payload["LoginData"]); break; case "DISCONNECT": client.Dispose(); throw new SocketException(); } } } catch (Exception ex) when(ex is SocketException || ex is NullReferenceException) { if (client.Authenticated) { userConfiguration.MarkOffline(); } this.clients.Remove(client); Console.WriteLine($"{client.IPEndPoint.Address}:{client.IPEndPoint.Port} disconnected"); } }