Java TCPソケットが現在接続されているかどうかを調べようとしています。ソケットは現在接続されているかどうかではなく、ある時点で接続されています。
socket.isConnected();
助けてくれてありがとう、ありがとう。
socket.isConnected()
は、クライアントが接続すると(そして切断した後でも)常にtrueを返します。socket.getInputStream().read()
returns -1
_クライアントが切断された場合socket.getInetAddress().isReachable(int timeout)
:From isReachable(int timeout)そのアドレスが到達可能かどうかをテストします。ホストへの到達を試みるために実装によって最大限の努力が払われますが、ファイアウォールとサーバーの構成はリクエストをブロックし、特定のポートにアクセスできる一方で到達不能なステータスをもたらす場合があります。典型的な実装では、特権を取得できる場合はICMP ECHO REQUESTを使用します。そうでない場合は、宛先ホストのポート7(エコー)でTCP接続を確立しようとします。
プロトコルをある程度制御できると仮定すると、接続がアクティブであることを確認するためにハートビートを送信するのが大好きです。これは最も失敗に耐える方法であることが証明されており、多くの場合、接続が切断されたときに最も迅速に通知されます。
TCPキープアライブは機能しますが、リモートホストの電源が突然オフになった場合はどうなりますか? TCPタイムアウトには長い時間がかかる可能性があります。一方、アプリにx秒ごとにハートビート応答を予期するロジックがある場合は、最初に通知されない場合ネットワークまたはリモート側のサーバーの問題により、接続が機能しなくなります。
詳細については、 TCP接続を開いたままにするためにハートビートが必要ですか? を参照してください。