Einen Java-Socket so konfigurieren, dass er beim Trennen der Verbindung schnell fehlschlägt?
-
09-06-2019 - |
Frage
Ich habe einen Abhörport auf meinem Server, mit dem ich über eine Java-Klasse eine Verbindung herstelle Socket
Schnittstelle, d.h.
Socket mySocket = new Socket(host,port);
Ich schnappe mir dann ein OutputStream
, mit a dekorieren PrintWriter
im Autoflush-Modus und ich lache – außer wenn der Abhöranschluss geschlossen wird.Dann verstehe ich
tcp4 0 0 *.9999 *.* LISTEN
tcp 0 0 127.0.0.1.45737 127.0.0.1.9999 CLOSE_WAIT
und ich kann das Problem im Programm scheinbar nicht erkennen - ich habe es mit dem versucht isConnected()
Methode auf dem Socket, aber es scheint nicht zu wissen, dass die Verbindung geschlossen ist.
Ich möchte über das Problem informiert sein, wenn ich das nächste Mal versuche, an den Socket zu schreiben, damit ich versuchen kann, die Verbindung wiederherzustellen und das Problem zu melden.
Irgendwelche Ratschläge, bitte?
Vielen Dank an alle
Lösung
Eine kurze Auszeit festlegen?
Tut isOutputShutdown()
Bekommst du nicht, was du willst?
Man könnte immer eine bauen SocketWatcher
Klasse, die sich eigenständig entwickelt Thread
und versucht wiederholt, leere Zeichenfolgen in das zu schreiben Socket
bis das a aufwirft SocketClosedException
.
Andere Tipps
Die einzige zuverlässige Möglichkeit, eine unterbrochene Verbindung in TCP zu erkennen, besteht darin, darauf zu schreiben, was schließlich zu einer IOException „Verbindung zurücksetzen“ führt.Aufgrund der Pufferung geschieht dies jedoch nicht beim ersten Schreibvorgang nach der Trennung, sondern bei einem nachfolgenden Schreibvorgang.Daran können Sie nichts ändern.
Stellen Sie einen anderen Thread zum Lesen aus dem Socket ein.Es wird blockiert, bis der Socket geschlossen wird, und dann wird eine Ausnahme ausgelöst.Fangen Sie diese Ausnahme ab, um den Abschluss sofort zu erkennen.