# Netzwerkprogramm sauber beenden



## Firephoenix (12. Jul 2012)

Hi,
ich schraube gerade an einer kleinen Client-Server anwendung die auf normalen Sockets basiert,
im Server benutze ich im Moment einen ExecutorService, im Client einen normalen Thread/Runnable um den Input der anderen Seite auszulesen.
Die Threads blocken durch die read-operationen natürlich regelmäßig (auch wenn ich die jeweilige Anwendung beende).

Wie sieht denn in so einem Fall der saubere Weg aus die Anwendung zu beenden?
(speichern etc ist erledigt, ich muss nur die Threads loswerden)
-Setze ich alle Threads für die inputs als deamon und lasse der JVM die arbeit die abzuschießen wenn ich meine Anwendung beende?
-Ist es sinnvoller die Threads manuell zu beenden (interrupt?).


----------



## HoaX (12. Jul 2012)

Ich würde die Threads beenden wenn keine Verbindung mehr da ist. Beim Beendend close() vom Socket aufrufen und gut is.


----------



## Disconnect (13. Jul 2012)

Ich persönlich löse dies bei meinen Netzwerk-Programmen so :

Der Client sendet an den Server ein "disconnect". Dadurch reagiert das read() vom Server und beginnt den Thrad aufzuräumen. Damit das funktioniert muss natürlich das Aufräumen im selben Thread wie read() erfolgen damit der Server nicht wieder im read() hängen bleibt. Nach dem der Server nun alle Referenzen aufgeräumt hat (sowohl vom Thread aus auf andere Objekte als auch von außen auf den Thread und dessen Objekte selbst) sendet der Server an den Client ebenfalls "disconnect" und schließt die Streams sowie den Socket. Danach wird über return der Thread beendet und für den GC freigegeben. Das "disconnect" an den Client hat lediglich die Aufgabe das dort ebenfalls read() getriggert wird so das der Client den read()-Thread ebenfalls sauber beenden kann.

Ein "gewaltsames killen" durch interrupt() halte ich für schlecht da es Missbrauch einer Exception ist was man vermeiden sollte. Ob man beim Client den read()-Thread als Deamon setzen sollte hängt davon ab ob nach dem DC der Client beendet wird oder ob dieser weiterläuft um z.B. eine andere Verbindung aufzubauen.


----------



## Firephoenix (13. Jul 2012)

Hi,
hatte mir sogar schon bei der Entwicklung ein Disconnect-Paket definiert und nie benutzt 

Mit dem Paket aus dem read-lock zu springen, das socket zu schließen (schließt ja auch alle aufgesetzten streams) und die referenzen auf den thread und sonstige ressourcen zu entfernen hat wunderbar funktioniert.

Thema erledigt und danke nochmal.


----------

