# ServerSocket merkt nicht, wenn keiner mehr da ist



## Samuel (2. Jul 2006)

Hallo,

wir haben hier ein Socket problem, unser ServerSocket fügt neue Cons in eine VerbindungsMenge hinzu, diese iteriert er nicht blockierend durch indem er sich den InputStream holt und guckt, ob da was drin ist.
Das funzt auch wunderbar, aber sobald sich ein Client brutal disconnected, dh einfach System.exit macht merkt das der Server nicht, wir haben hier einen Client, den der Server mit

```
System.out.println(sm.getVerbindungsMenge().get(0).getSocket().toString());
```
pausenlos ausgibt, es wird IP und Port ausgegeben, aber trennt sich dieser, wird trotzdem IP und alles ausgegeben, wir haben schon mit isBound versucht, bleibt true, mit isConnected() usw, aber immer true.

Wie kann man sowas serverseitig lösen?


----------



## foobar (2. Jul 2006)

Teste doch mal den In- und Outputstream des toten Sockets.


----------



## Samuel (2. Jul 2006)

haben wir, der totesocket hatte beide streams


----------



## foobar (3. Jul 2006)

Hmm, warum wird der Client überhaupt so abbrupt beendet? Du kannst im Client den Socket doch sauber Beenden und alles schließen(In- Outputstream, Socket etc.). Ein System.exit brauchst du eigentlich sowieso nicht.


----------



## Samuel (3. Jul 2006)

Naja, es geht um Fehlertoleranz, wenn die Clientseite aus irgendeinem Grunde tot ist, STRG ALT Entf oder PC abgestürzt ist, würde das so andere Clients in Mitleidenschaft ziehen, da diese noch am Server hängen, welcher auch noch auf den toten Client wartet


----------



## foobar (3. Jul 2006)

Ich habs zwar nicht ausprobiert, aber ich denke, wenn der Client tot ist dürftest du vom Serversocket In- Outputstream keine Daten lesen respektive schreiben können. Wohin sollte der denn dann schreiben?


----------



## Lim_Dul (3. Jul 2006)

Sobald du versuchst auf seinen toten Socket Daten zu senden, kommt eine IOException. Das ist meines Wissens auch die einzig sichere Möglichkeit, sowas zu testend. Die Streams behaupten nämlich alle gültig zu sein, auch wenn der Client am anderen Ende weg ist. Ich hab das Problem bei mir so gelöst, indem in regelmässigen Abständen ein PING Befehl an den Client gesendet wird. Der Client ignoriert diesen Befehl einfach und gut ist.


----------



## Samuel (3. Jul 2006)

Hm, ok, dass wäre auch bei uns die einzige Möglichkeit.
Mit den SsetTimeouts sind wir auch nicht weitergekommen


----------



## millinär (10. Jul 2006)

also ich habe es mal mit ObjectOutput bzw. Input Streams probiert und da wird defentiv eine Exception ausgelöst
egal wie


----------

