public void Process() { try { string message; Stream = client.GetStream(); BinaryFormatter formatter = new BinaryFormatter(); List <string> requests = new List <string>(); while (true) { try { Dictionary <string, object> data = (Dictionary <string, object>)formatter.Deserialize(Stream); switch ((string)data["command"]) { case "connect": { userName = (string)data["username"]; signVerify = (byte[])data["signVerK"]; ip = client.Client.RemoteEndPoint.ToString(); ip = ip.Remove(ip.IndexOf(':')); message = "Connections update:\n"; data.Clear(); data.Add("command", "newconnection"); data.Add("message", $"{userName} ({ip}) has connected."); List <string> clientList = new List <string>(); foreach (ClientObject user in ServerObject.clients) { clientList.Add(user.userName); } data.Add("clientList", clientList); server.BroadcastMessage(data, this.Id); break; } case "show connections": { data.Clear(); data.Add("command", "show connections"); data.Add("message", "Current connections:"); List <string> clientList = new List <string>(); foreach (ClientObject user in ServerObject.clients) { clientList.Add(user.userName); } data.Add("clientList", clientList); formatter.Serialize(Stream, data); break; } case "say": { message = (string)data["message"]; data["message"] = $"{userName}: {data["message"]}"; server.BroadcastMessage(data, this.Id); break; } case "key exchange": { requests.Add(userName); data.Add("message", $"{userName} requests a key exchange with you.\nEnter \"accept\" to accept."); data.Add("signVerK", signVerify); data.Add("username", userName); data.Add("requests", requests); formatter.Serialize(ServerObject.clients.Find(x => x.userName == (string)data["client"]).Stream, data); break; } case "accept": { requests.Remove((string)data["client"]); data.Add("message", $"{userName} has accepted your request."); data.Add("signVerK", this.signVerify); data.Add("username", userName); data.Add("ip", this.ip); formatter.Serialize(ServerObject.clients.Find(x => x.userName == (string)data["client"]).Stream, data); break; } default: { Console.WriteLine("Unknown command..."); break; } } } catch { Dictionary <string, object> data = new Dictionary <string, object>(); data.Add("command", "client disconnect"); data.Add("message", $"{userName} ({ip}) has disconnected."); server.BroadcastMessage(data, this.Id); break; } } } catch (Exception e) { Console.WriteLine(e.Message + "\n" + e.StackTrace); } finally { server.RemoveConnection(this.Id); Close(); } }