classParallelStaticServer{privatestaticfinalint NUMBER_OF_SLAVES =20;publicstaticvoidmain(){ServerSocket serverSocket =null;Counter counter =newCounter();// dort gibts nur eine zähler-Variable mit synchronized setter und gettertry{
serverSocket =newServerSocket(1250);}catch(Exception e){return;}for(int i =0; i < NUMBER_OF_SLAVES; i++){Thread t =newStaticSlave(serverSocket, counter);// Thread-Klasse mit Endlosschleife, nimmt Client-Requests entgegen
t.start();}}}
Was hier passiert, ist euch Profis sicher sowieso klar. Ein Server, der 20 Clients bedienen kann.
Was mir hier aber fehlt, ist ein close beim serverSocket. Bei den anderen Server-Varianten im Buch passiert immer irgendwo ein close, nur in dieser Klasse nicht. Sollte da nicht irgendwo ein close stehen, wenn man das schön ausprogrammiert?
Darin ist eine Endlosschleife, worin dann auf eingehende Verbindung gewartet wird.
Angenommen, ich starte den Server, beende den Server, starte den Server, beende den Server ... und mache das 1000 x hintereinander, ohne den Rechner selbst irgendwann neu zu starten. Wird dann immer mehr vom RAM belegt, weil ich für diesen socket nie ein close mache? Oder hat das sonst irgendwie Auswirkung auf TCP oder das Betriebssystem?
ich liebe solche fragen ... sie zeigen immer sehr schön das der fragen absolut gar keine ahnung davon hat wie moderne systeme funktionieren ...
ich würde dir empfehlen dich mal mit der grundlegenden arbeitsweise eines systems zu beschäftigen bevor du weiter den gedanken daran verschwendest einem rechner sagen zu wollen was er zu tun und zu lassen hat ... denn nichts anderes bedudetet das wort "programmieren"
Darin ist eine Endlosschleife, worin dann auf eingehende Verbindung gewartet wird.
Angenommen, ich starte den Server, beende den Server, starte den Server, beende den Server ... und mache das 1000 x hintereinander, ohne den Rechner selbst irgendwann neu zu starten. Wird dann immer mehr vom RAM belegt, weil ich für diesen socket nie ein close mache? Oder hat das sonst irgendwie Auswirkung auf TCP oder das Betriebssystem?
Ist die streng geheim, oder kannst du die mal posten?
Mal angenommen der Code darin sieht so aus, wie ich mir den nach deiner obigen Aussage vorstelle, dann darf der Serversocket erst geschlossen werden, wenn kein einziger Client mehr verbunden ist oder sich verbinden können soll. Sprich: beim Beenden des Programms.
Das Beispiel ist in einer Hinsicht sowieso sehr negativ: Ein Java-Programm terminiert, sobald der letzte nicht-daemon-Thread terminiert. Vermutlich benutzt die von dir unterschlagene Klasse keine daemon-Threads. In dem Fall läuft die Anwendung bis sie mit Strg+C abgebrochen wird oder System.exit() ausgeführt wird. Sehr unschön!
Angenommen, ich starte den Server, beende den Server, starte den Server, beende den Server ... und mache das 1000 x hintereinander, ohne den Rechner selbst irgendwann neu zu starten. Wird dann immer mehr vom RAM belegt, weil ich für diesen socket nie ein close mache? Oder hat das sonst irgendwie Auswirkung auf TCP oder das Betriebssystem?
Das Schlimmste, was dir passieren kann ist, dass beim nächsten Start deines Programm der Port des Servers fürs Betriebssystem noch belegt ist und dir das Programm mit einer Exception um die Ohren fliegt. Nach einer gewissen Zeit sollte der dann vom Betriebssystem wieder freigegeben werden. Beim RAM hast du kein Problem. Sobald die Java-VM beendet wird, kümmerst sich das Betriebssystem darum, dass der wieder freigegeben wird. Darauf hast du keinen Einfluß.
Wäre es vielleicht besser, keine Endlosschleife zu programmieren? Statt dessen eine Schleife, in der immer kontrolliert wird, ob in der Konsole etwas eingegeben wird. Und wird z. B. "end" eingegeben, dann verlässt man die Schleife und macht den close?