private void ListenForServerConnection() { tcpListener.Start(); TcpClient client = new TcpClient(); while (true) { try { client = tcpListener.AcceptTcpClient(); ConnectedServer server = new ConnectedServer(client); Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientConnection)); clientThread.Start(server); } catch (SocketException) { // can be ignored (thread stopped and no socket connection) break; } catch (Exception ex) { RefreshConsole("[ERROR] " + ex.ToString()); break; } } tcpListener.Stop(); }
private void HandleClientConnection(Object serverData) { ConnectedServer server = (ConnectedServer)serverData; connectedServers.Add(server.Client, server); NetworkStream stream = server.Client.GetStream(); int byteRead; while (true) { try { byte[] message = new byte[1024]; byteRead = stream.Read(message, 0, 1024); stream.Flush(); if (byteRead == 0) { break; } PacketType type = (PacketType)message[0]; switch (type) { case PacketType.ListServer: int nameLength = BitConverter.ToInt32(message.SubArray(1, 4), 0); string serverName = Encoding.ASCII.GetString(message.SubArray(5, nameLength)); int maxPlayers = BitConverter.ToInt32(message.SubArray(5 + nameLength, 4), 0); server.Name = serverName; server.MaxPlayers = maxPlayers; RefreshConsole($"New Server: {server.Name}"); break; case PacketType.RefreshServer: int currentPlayers = BitConverter.ToInt32(message.SubArray(1, 4), 0); server.PlayerCount = currentPlayers; RefreshConsole($"Update PlayerCount: {server.PlayerCount}"); break; case PacketType.RequestList: RefreshConsole($"Request server list from"); break; } } catch { // server no longer connected break; } } server.Client.Close(); connectedServers.Remove(server.Client); RefreshConsole(); }