Hi,
Ich habe ein Problem mit dem TCPListener.
Und zwar programmiere ich einen einfachen thread-basierten Netzwerkserver, der die Kommunikation mit mehreren Clients abwickeln kann.
Dazu habe ich eine Methode geschrieben, welche ständig auf neue Clients wartet (und natürlich in einem eigenen Thread ausgeführt wird):
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| private void warteAufClient() { listener.Start();
TcpClient client = new TcpClient();
while (isActive) { try { client = listener.AcceptTcpClient(); } catch { } finally { }
clients.Add(client);
Thread clientLoop = new Thread(new ParameterizedThreadStart(bearbeiteClient));
clientLoop.Start(client); } } |
Nun habe ich aber ein Problem den Server wieder zu beenden, da AcceptTCPClient() den Thread ja bis zur nächsten Verbindung anhält.
Dadurch zeigt meine Laufbedingung für die While-Schleife keine Auswirkung. Diesem Effekt mit try-catch-finally entgegenzuwirken funktioniert leider nicht.
Gibt es da eine schicke Möglichkeit?
//EDIT:
Hab es jetzt so gelöst:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| private void warteAufClient() { listener.Start();
TcpClient client = new TcpClient();
while (true) { try { client = listener.AcceptTcpClient(); } catch { break; } clients.Add(client);
Thread clientLoop = new Thread(new ParameterizedThreadStart(bearbeiteClient));
clientLoop.Start(client); } } |
Über die ServerBeenden Methode schließe ich den listener mit listener.stop(). Dabei wirft die AccptTCPCClient Methode allerdings eine Exception, die ich (unschönerweise) einfach abfange und aus der schleife springe.
Wenn jemand eine bessere Lösung hat, kann er sie gerne posten...