# Feststellen, ob Socket noch lebt!



## meladamo (19. Jan 2005)

Hallo Leute,

ich habe einen Client, der ein Socket öffnet und über den mit dem Server kommuniziert. Der Socket wird nicht geschlossen, solange der Client nicht beendet wird. Ich muss jetzt in den Client eine Funktionalität einbauen, die folgendermaßen aussieht: falls die Netzverbindung aus irgendeinem Grund wegbricht oder die Verbindung vom Server abgebaut wird, so soll ein weiterer Socket bereitstehen und  in so einem Fall zu dem gewechelt werden. Ich kappe die Netzverbindung, indem ich das Netzkabel rausziehe und es dann wieder anschliesse. Meine Frage ist jetzt: wie stelle ich fest, dass die Verbindung über den ersten Socket nicht mehr existiert? Die Methoden von Socket, wie isBound, isConnected funktionieren leider nicht. Eine Möglichkeit wäre, Nachrichten zum Server zu senden und eine IOException abzufangen, aber ich möchte wissen, ob der Socket noch lebt, bevor ich irgendetwas schicke!

Danke.


----------



## stev.glasow (19. Jan 2005)

Ich habe jetzt nur den Titel gelesen, aber schaue die mal  isClosed() und  isConnected()  an, hilft das vieleicht?
[edit]
In wie fern funktioniert  isConnected() nicht?
[edit]
Ehrlich gesagt ich habe keine Ahnung, ich sollte wohl erst denken und dann schreiben  :? 
@Mods: bitte löschen  :roll:


----------



## meladamo (19. Jan 2005)

isClosed und isConnected geben immer true zurück, obwohl die Netzverbindung nicht mehr besteht. Das ist das Problem! Und das hilft mir garnicht.


----------



## stev.glasow (19. Jan 2005)

Jo, ich glaub isConnected()  liefert true zurück wenn Verbindung überhaupt erfokgreich erstellt WURDE, sprich ob es überhaupt vebunden war. Bin mir aber nicht 100% sicher.
Hast du mal isClosed() probiert?


----------



## meladamo (19. Jan 2005)

Sorry, isClosed gibt immer false zurück und isConnected immer true. D.h. der Socket ist immer da, obwohl es keine Verbindung zum Server gibt.


----------



## stev.glasow (19. Jan 2005)

Ich hab das eben mal selber getestet und der merkt das wirklich nicht  :?
Mein Lösungsvorschlag wäre einen recht kleines so_timeout zu setzen und wenn du prüfen willst ob die Verbindung noch besteht so eine Art ping-nachricht zuschicken, wenn die Verbindung unterbrochen wurde versucht er dann noch bis das so_timeout abgelaufen zu schreiben und wirft dann SocketTimeoutException. Ne bessere Idee habe ich leider nicht..


----------



## meladamo (19. Jan 2005)

Also ich habe etwas gefunden, was mich halbwegs zufrieden stellt. Die Klasse InetAdress enthält die beiden Methoden getByName() und isReachable(int timeout). Um festzustellen, ob die Netzverbindung noch besteht mache ich folgendes:


```
InetAdress proxy = InetAdress.getByName("xxx.xxx.xxx.xxx");
while(proxy.isReachable(2000)){
----------
}
```

Nachdem die Verbindung wieder besteht, erzeuge ich einen neuen Socket und dann gehts wieder weiter. Das Problem dabei ist, dass die isReachable Methode Zeit braucht, um festzustellen, ob der Server erreichbar ist. Und das ist schlecht für die Performance meines Programms.


----------



## Grizzly (19. Jan 2005)

Auf das Problem bin ich auch schon vor langer Zeit gestossen. Aber außer das man versucht etwas über die Verbindung zu schicken ist mir bis jetzt auch keine andere Lösung eingefallen. Wobei das auch der Java Philosophie entspricht: Erst probieren und dann unter Umständen eine Exception geworfen bekommen.


----------

