C# Server mit vielen Clients => Threads?

Fee

Okay
20 April 2006
936
73
Ich möchte einen Server in C# programmieren (TCP), der viele Clients gleichzeitig packt, die über eine längere Zeit (Minuten bis Stunden) verbunden sind und vom Server Text empfangen sollen. Nach Anmeldung am Server (vor der Übertragung der Nachrichten), wird vom Client nichts mehr geschickt, der Server muss also nur den Socket-Stream bei einem neuen Client lesen und merken, wenn eine Verbindung unterbrochen wird.

Mein Problem ist jetzt, dass ich nicht weiß, wie ich das umsetzen soll. Die Texte werden wie in einem Chat (z.b. IRC) übertragen, also "senden" - "warten auf neuen Text" - "senden" (an mehrere Clients, aber nicht immer alle).
Ich kann schlecht für jede Clientverbindung einen neuen Thread aufmachen, da es unter Umständen viele Clients sein können. Deswegen ist meine Frage: Bringen da Threads überhaupt was, oder soll ich versuchen, den Text an alle Clients, die ihn empfangen sollen, nacheinander zu schicken? Es sollte aber möglichst gleichzeitig ankommen (es handelt sich meistens um die Länge eines Satzes), so dass man sich wie in einem IRC unterhalten kann.
Oder gibts da noch eine andere Möglichkeit?

Bei wikipedia steht, dass die meisten (?) IRC-Daemonen auch kein Threading nutzen. Schicken diese die Befehle auch nacheinander an die Clients oder wird das anders übertragen? Immerhin hat ein IRC-Server ja nicht nur 10 Benutzer ;).
 
Also aus der Java-Welt kann ich dir sagen das sogar hunderte Threads noch funktionieren, aber dafür nutzt man dann i.R. asynchrone IO-APIs, da musst du mal schauen ob C# so etwas besitzt.
 
Du kannst ja einen Thread-Pool implementieren. Das limitiert die Anzahl der erzeugten Threads auf eine obere Grenze.
 
Ich kenne mich mit Threading jetzt nicht so aus, wie funktioniert so ein Pool? Ich kenn nur so ein System, wo es mehrere Threads gibt und sobald einer mit seinem Task fertig ist, bekommt er einen neuen. Weiß nicht, wie das hier funktionieren soll, da solch ein Task ja sehr lange dauert. Wenn dann alle Threads besetzt sind, passiert nichts mehr ?
 
dann kann man aber auch gleich die Anzahl der TCP-Verbindungen limitieren.
Eingehende Verbindungen kommen dann aber nicht mehr durch?
Wenn dann alle Threads besetzt sind, passiert nichts mehr ?
Je nach Implementierung.
Du könntest eine alte Verbindung beenden, um Platz für eine neue zu schaffen. Ggf. Prioritäten zuteilen, welche Verbindung dir wichtiger is.

Oder du könntest die Verbindung nur annehmen und das verbundene Socket dann einstweilen in einer Queue einreihen. Der erste Thread, der wieder frei wird, entnimmt dann draus und bearbeitet weiter.
Das ganze funktioniert natürlich nur, wenn die Threads schneller arbeiten können, als eingehende Verbindung reingehen.

Oder du teilst die Verbindungen gleichmäßig auf alle Threads auf. Jeder Thread kann dann intern Round-Robin arbeiten.