# Exception beim Schließen eines Sockets



## clupus (3. Aug 2009)

Hallo allerseits,

ich versuche gerade eine Client-/Server-Verbindung aufzubauen.

Mein Problem: Ich will, dass nach senden von "quit" vom Client zum Server letzterer die Verbindung kappt.


```
private Socket sock;
[...]
void quit() throws IOException{
        pw.println("Good Bye");
        pw.flush();
        pw.close();
        is.close();
        sock.close();
    }
```

Das ganze steht in einer Klasse, die Thread erweitert. Wenn ich jetzt das ganze laufen lasse und per telnet ein quit an den Server sende, wird die Verbindung auch beendet.
Leider bekomme ich auf meiner Standardausgabe eine Ausgabe von wegen "IO Exception: java.net.SocketException: Socket closed".
Ja, klar, dass der Socket geschlossen wird ist mir auch klar (ich mach's ja selber). Aber wie kann ich die Warnung unterdrücken (try/catch!)? Ich habe alles mit try catch umschlossen, aber die Meldung wird nirgends rausgefiltert und ich weiß nicht, wo ich ansetzen soll.

Weil das ganze etwas unübersichtlich ist, hab ich mal als Anhang das wichtige rangehängt.

Kann mir jemand sagen, wie ich die Meldung weg bekomme?
Christian

PS: DaemonTest ist wie der Name schon sagt nur eine Test-Klasse zum starten. Außerdem verwende ich die run()-Methode, damit ich keine Probleme mit Nebenläufigkeiten bekomme, solange ich noch teste.


----------



## sparrow (3. Aug 2009)

Welche Zeile löst die Exception denn aus?


----------



## Painii (3. Aug 2009)

ich vermute wenn da IOException: Socket closed steht dann ist Socket closed der Grund für die Exception -> Dein Programm will evtl. noch auf den Socket zugreifen nachdem er geschlossen wurde?


----------



## ice-breaker (3. Aug 2009)

Beendet der Server vllt schon die Socketverbindung, wenn er das "Good Bye" bekommt? Weil im Normalfall ist dafür das Kommando da.


----------



## clupus (3. Aug 2009)

Painii hat gesagt.:


> ich vermute wenn da IOException: Socket closed steht dann ist Socket closed der Grund für die Exception -> Dein Programm will evtl. noch auf den Socket zugreifen nachdem er geschlossen wurde?



Ja, das ist (zwangsläufig) korrekt.

Um möglichst keine hardcoded Protokoll-Anweisungen verwenden möchte, habe ich BYaccJ/JFlex verwendet, um das Client-Server-Gespräch zu parsen. Und BYaccJ wertet den Input Stream bis zum EOF aus. Wenn ich die Verbindung aber jetzt abbrechen möchte, muss ich ihm irgendwie sagen, dass er das parsen lassen soll. In die Klasse möchte ich aber nicht eingreifen, da bei jedem neu erstellen der Klasse mittels byaccj die manuelle Korrektur gelöscht würde.

Gibt es also entweder eine Möglichkeit den Stream "von außen" zu beenden, oder so was? Oder kann mir jemand sagen, wie ich den Fehler auffangen kann und so einen korrekten Log erstellen kann?

Christian


----------



## tuxedo (3. Aug 2009)

Muss es denn so kompliziert sein?

Warum nicht RMI/SIMON/...?


----------



## clupus (3. Aug 2009)

Also, ich hab's gefunden.

War in der yylex() Methode des Parsers drinne. Dort habe ich das korrigiert und gut ist's.

Danke nochmal für mitdenken
Christian


----------

