2009-09-07 10 views
23

Java TCPソケットがであるかどうかを調べようとしていますが、現在接続されているかどうかではなく、ソケットが接続されているかどうかがわかります。ソケットが現在Javaで接続されているかどうかを確認するにはどうすればよいですか?

socket.isConnected(); 

ありがとう、ありがとう。

+3

http://stackoverflow.com/questions/969866/java-detect-lost-connection – Aziz

+1

、別のhttp://stackoverflow.com/questions/485855/how-do-you-handle- socket-disconnecting-in-java –

+0

アンサー[ここ](http://stackoverflow.com/a/17889321/207421)。 – EJP

答えて

14

あなたがプロトコルをある程度のレベルで制御しているとすれば、私は接続がアクティブであることを確認するためにハートビートを送信することを熱望しています。これは最も失敗のない方法であることが証明されており、接続が切断されたときに最も早く通知されることがよくあります。

TCPキープアライブは機能しますが、リモートホストの電源が突然切れた場合はどうなりますか? TCPがタイムアウトするまでに時間がかかることがあります。一方、アプリケーションにx秒ごとにハートビートの返信が必要なロジックがある場合、最初に接続を取得しないと、リモート側のネットワークまたはサーバーの問題によって接続が機能しなくなることがわかります。

詳細は、Do I need to heartbeat to keep a TCP connection open?を参照してください。

16
  • socket.isConnected()は、クライアントが接続すると(そして接続解除後も)変わってしまいます。
  • socket.getInputStream().read()
    • スレッドがある限り、クライアントが接続されているので、あなたのプログラムが何もしていない可能れるように、入力を待ちます - クライアントが
  • を切断した場合、あなたは、いくつかの入力
  • returns -1を取得する場合を除き、
  • socket.getInetAddress().isReachable(int timeout)から:isReachable(int timeout)

    そのアドレスに到達可能かどうかをテストします。実装がホストに到達しようとするのが最善ですが、ファイアウォールとサーバーの構成によって要求がブロックされ、到達不能な状態になり、特定のポートにアクセスできる場合があります。典型的な実装では、特権を取得できる場合はICMP ECHO REQUESTを使用し、そうでない場合は宛先ホストのポート7(Echo)にTCP接続を確立しようとします。

+1

"out.checkError()"には何がありますか?あなたはSystem.outを意味しますか?それはうまくいくとは思わない。 – RoboAlex

+7

が正しくありません。 'checkError()は、ソケットを使用しているときに* prior * IOExceptionがあったかどうかを示します。それは、クライアントが切断されるとすぐに真実になりません。 -1 – EJP

関連する問題