web-dev-qa-db-de.com

Wie überprüfe ich, ob ein Socket derzeit in Java verbunden ist?

Ich versuche herauszufinden, ob ein Java TCP Socket ist derzeit verbunden, das Folgende scheint mir nur zu sagen, ob der Die Steckdose wurde irgendwann angeschlossen - nicht, ob sie gerade noch angeschlossen ist.

socket.isConnected();

Jede Hilfe dankbar, danke.

25
Supertux
  • socket.isConnected() gibt immer true zurück, wenn der Client eine Verbindung herstellt (und auch nach dem Trennen), komisch !!
  • socket.getInputStream().read()
    • lässt den Thread auf Eingaben warten, solange der Client verbunden ist, und lässt Ihr Programm daher nichts tun - es sei denn, Sie erhalten Eingaben
    • returns -1 Wenn der Client die Verbindung getrennt hat
  • socket.getInetAddress().isReachable(int timeout): From isReachable (int timeout)

    Testen Sie, ob diese Adresse erreichbar ist. Die Implementierung bemüht sich nach besten Kräften, den Host zu erreichen, jedoch blockieren Firewalls und die Serverkonfiguration möglicherweise Anforderungen, die zu einem nicht erreichbaren Status führen, während auf bestimmte Ports möglicherweise zugegriffen werden kann. Bei einer typischen Implementierung werden ICMP-ECHO-ANFORDERUNGEN verwendet, wenn das Privileg abgerufen werden kann. Andernfalls wird versucht, eine TCP) -Verbindung an Port 7 (Echo) des Zielhosts herzustellen.

19
Sumit Singh

Angenommen, Sie haben ein gewisses Maß an Kontrolle über das Protokoll. Ich bin ein großer Fan von Heartbeats, um zu überprüfen, ob eine Verbindung aktiv ist. Es hat sich als die ausfallsicherste Methode erwiesen und benachrichtigt Sie häufig am schnellsten, wenn eine Verbindung unterbrochen wurde.

TCP-Keepalives funktionieren, aber was ist, wenn der Remote-Host plötzlich ausgeschaltet wird? TCP kann eine lange Zeit in Anspruch nehmen. Wenn Ihre App hingegen über eine Logik verfügt, die alle x Sekunden eine Heartbeat-Antwort erwartet, wissen Sie Bescheid, wenn Sie sie zum ersten Mal nicht erhalten Die Verbindung funktioniert nicht mehr, entweder durch ein Netzwerk- oder ein Serverproblem auf der Remote-Seite.

Siehe Muss ich einen Heartbeat ausführen, um eine TCP Verbindung offen zu halten? für weitere Informationen.

16
Jason Nichols