# Serversocket sauber beenden



## RealHAZZARD (3. März 2009)

Hallo, 
ich habe ein kleines Problem mit meinem Serversocket. Ich habe es eigentlich so gemacht, wie man es in den meisten Beispielen auch findet. Ich initialisiere den Serversocket, dann lasse ich meine Anwendung in einem extra Thread auf einen Clienten warten. Das funktioniert auch bestens, aber mein Problem entsteht beim Beenden der Anwendung. Denn dann wartet der extra Thread in der accept - Methode auf den nächsten Client (ist ja eigentlich auch gut so). Aber irgendwann stellt auch dieser Thread fest, dass der Socket bereits geschlossen ist und bricht mit einer SocketException ab. Genau diesen unkontrollierten Abbruch möchte ich verhindern. Kennt da jemannd eine gute Herangehensweise?
Soweit mein relevanter Code:

```
private void listen(){
        while(!stop){
            try{
                Socket client = socket.accept();    //Abbruch nach beenden des Sockets
                BufferedWriter bw = new BufferedWriter( new OutputStreamWriter(client.getOutputStream()));
                if(report==null) monitor();
                bw.write(report);
                bw.close();
                client.close();
            }catch(IOException ioe){
                 LoggingManager.getInstance().log(LogLevel.ERROR,ioe);
            }
        }
```

Beim Beenden wird einfach nur das Stop - Flag auf true gesetzt und der socket via close() beendet. Mehr mache ich nicht.


----------



## Bratkartoffel (3. März 2009)

Hallo,

probier mal noch nen SocketException-Catch-Block 
Ist scho nne Weile her, seit ich das letzte Mal mit Sockets und JAVA gearbeitet habe, aber so müsste es gehen.
Wenn nicht, dann steht in stderr eh schön ein Stacktrace drin, mit dem du genau verfolgen kannst, in welcher Zeile die Exception geworfen wird. Diese kannst du dann mit nem Try-Catch abfangen.

Gruß
BK


----------



## RealHAZZARD (3. März 2009)

Danke für die schnelle Antwort. Deinen Vorschlag hatte ich mir schon als Notfallplan zurecht gelegt. Aber Exceptions sind ja immer so eine Sache. Ich möchte sie in diesem Fall am besten gar nicht erst entstehen lassen. Ich suche also eher nach ein Möglichkeit den ServerSocket sauber zu beenden. Nicht dass es in diesem Einzelfall schlimm wäre die Exception zu fangen, aber es gehört zu meinen Prizipien den Sinn von Exceptions der wörtlichen Bedeutung zu entnehmen. Also will ich so viel wie möglich davon vermeiden, wenn es einen sauberen Weg gibt.


----------



## Bratkartoffel (3. März 2009)

Hi,

ok, das ist verständlich 
Nun, dann weiß auch nicht weiter, ich habs bisher mit dieser Exception gelöst... 

Gruß
BK


----------



## zeja (3. März 2009)

Du müßtest den Thread mit einem Interrupt eigentlich beenden können.


----------



## Anime-Otaku (3. März 2009)

achja und die close Methoden in ein extra finally packen. Sonst wird die Verbindung bei einer Exception nicht geschlossen.


----------



## Kai008 (3. März 2009)

Könnte man den warte-Thread nicht einfach zu einem Dämon machen? In diesen Fall würde das Programm doch garnicht auf diesen warten bis es beendet. Da der S.Socket in einer anderen Thread schließt wäre das doch kein Problem, oder?

Eine andere Möglichkeit die mir noch einfällt wäre es den SS. mit einen Timeout warten zu lassen, dann zu prüfen ob er noch offen ist und falls schon wieder wartet.


----------



## RealHAZZARD (3. März 2009)

@all: Danke für die rege Beteiligung.
@zeja: Das habe ich versucht, bringt aber leider keinerlei Änderung
@Kai008: Den letzten Vorschlag  werde ich bei Gelegenheit (heute oder morgen) testen. Danke
@all: Ich glaube ich habe mich wohl oben falsch ausgedrückt. Ich sehe das Problem weniger in Sachen Thread, sondern eher darin, dass die accept - Methode noch wartet, obwohl der socket gerade geschlossen wird / ist. Wahrscheinlich bekommt der Thread (auf den ich keinen Einfluss habe, den ich auch nicht kreiert habe und der wohl meiner Vermutung nach innerhalb der accept - Methode für das Warten Selbiger zuständig ist) irgendwann mit, dass der Socket geschlossen ist und wirft eine Exception.


----------

