C# TCPClient Verwaltung

Penman

Lieutenant
🎅Rätsel-Elite ’24
Registriert
Feb. 2009
Beiträge
906
Hallo Programmierer,
meinen Urlaub wollte ich mal nutzen, um mich ein wenig weiterzubilden und zwar im Bereich Programmierung in C#. Das Ziel ist ein kleiner Server, der von einem kleinen Clienten ein paar Befehle annehmen kann (echo, time, stop...). Nichts großes, sondern einfach.

Schnell ist der Server geschrieben und er tut eigentlich auch, was er soll. Jedoch bin ich dank Microsoft auf ein Problem gestoßen:
In diesem Beispiel von MSDN (http://msdn.microsoft.com/de-de/library/bb979208.aspx) kann sich ein Client verbinden, dieser wird als Klassenobjekt auch einfach in die ArrayList gepackt, jedoch: Wenn der Client aus irgendeinem Grund die Verbindung abbricht, schlägt der StreamReader fehl (was logisch ist) und beendet das Programm.

So kommen 2 Fragen auf:
1. Wie erkenne ich am besten, ob ein Client die Verbindung abgebrochen oder beendet hat
2. Speichertechnisch sehe ich da ein Problem bei der ArrayList. Alle Verbindungen werden einfach in die Liste gepackt und wenn sie "sterben", bleiben ihre Leichen einfach darin und verbrauchen weiter Speicher. Wie löst man dieses Problem am besten?

Danke schon mal für alle Antworten.
 
Zu 1.:

Schau mal ob du direkt am Socket die Überprüfung vornehmen kannst, beispielsweise mit einer Property wie "Socket.Connected".

zu 2.:
Prinzipiell legt doch dein Server einen neuen Thread für jeden Client an der sich mit dem Server verbindet. Die Verwaltung dieser Threads, also der Clients ist eine ArrayList. Okay, soweit ist dem nichts einzuwenden. Wenn du aber von "Clients in ArrayList speichern" sprichst, meinst du dann dasselbe wie ich eine Zeile weiter oben beschrieben habe, oder wie soll das bei dir aussehen?
Grundsätzlich hast du recht, dass kurzzeitig der Speicher unnötig belastet wird. Bei den Mengen an Clients merkst du das aber nicht, sofern ich annehmen darf dass die Anzahl unter 10 bei dir bleibt. Wo die Grenze ist kann man immer schwer sagen, aber was man sagen kann, ist das du für eine etwas effizientere Verwaltung der Threads sorgen kannst, in dem du bei einem Verbindungsabbruch den Thread aus deiner Liste rausschmeißt, in dem du die Referenz kappst. Damit schwirrt das Objekt, was auch immer es für einen Typ hat, erstmal im Speicher rum und wird aufgeräumt, sofern der nächste GarbageCollection-Zyklus anläuft. Alternativ könntest du auch einfach den Eintrag disposen(), also zum "aufräumen" freigeben.
Vorher solltest du aber sicherstellen, dass der Thread serverseitig gestoppt wird/wurde.
 
Zurück
Oben