2008-08-22 9 views
3

Ich habe ein Listening-Port auf meinem Server, dass ich eine Java-Klasse zu verwenden und die Socket Schnittstelle bin verbinden, dhKonfigurieren Sie einen Java-Socket zu Fail-Fast beim Trennen?

Socket mySocket = new Socket(host,port); 

ich ein OutputStream dann greifen, mit einem PrintWriter in Autoflushing Modus dekorieren und ich bin lachen - außer wenn der Abhörport schließt. Dann bekomme ich

tcp4  0  0 *.9999     *.*     LISTEN 
tcp  0  0 127.0.0.1.45737  127.0.0.1.9999   CLOSE_WAIT 

und ich kann nicht das Problem im Programm zu erkennen scheinen - ich habe versucht, die isConnected() Methode auf dem Sockel verwenden, aber es scheint nicht zu wissen, dass die Verbindung geschlossen wird.

Ich möchte auf das Problem achten, das nächste Mal, wenn ich versuche, in den Socket zu schreiben, damit ich versuchen kann, die Verbindung wiederherzustellen und das Problem zu melden.

Bitte um Rat fragen?

Danke alle

+0

Die isConnected() - Methode teilt Ihnen mit, ob Sie jemals diesen Socket verbunden haben. Sie erfahren nichts über den Status der Verbindung. – EJP

Antwort

0

Einen kurzen Timeout setzen?

Erreicht isOutputShutdown() Sie nicht, was Sie wollen?

konnte man immer eine SocketWatcher Klasse bauen, die in ihren eigenen Thread dreht und versucht immer wieder leere Zeichenfolgen an den Socket zu schreiben, bis dass ein SocketClosedException aufwirft.

+0

Nein, isOutputShutdown() gibt ihm nicht, was er will, und auch nicht ein kurzes Timeout oder ein Versuch, eine SocketClosedException zu bekommen, die es nicht einmal gibt. Sie verwechseln den Status des Sockets mit dem Status der Verbindung. -1 – EJP

-2

Legen Sie einen anderen Thread zum Lesen aus dem Socket fest. Es wird blockiert, bis der Socket geschlossen ist, und dann wird eine Ausnahme ausgelöst. Fangen Sie diese Ausnahme, um das Schließen sofort zu erkennen.

+0

Es ist möglich, dass eine TCP-Verbindung auf eine Weise fehlschlägt, die durch einen Lesevorgang nicht erkannt wird. – EJP

0

Die einzige zuverlässige Möglichkeit, eine unterbrochene Verbindung in TCP zu erkennen, besteht darin, in sie zu schreiben, was zu einer IOxception "Verbindungszurücksetzung" führen kann. Aufgrund der Pufferung wird es jedoch beim ersten Schreiben nach der Trennung nicht passieren, sondern bei einem nachfolgenden Schreiben. Du kannst nichts dagegen tun.