2

I'm working on a Java hearbeat sensor, that just tells you if the other side died. I found some code like so:

        isConnected = kkSocket.isConnected() &&
                      !kkSocket.isClosed() &&
                      InetAddress.getByName(serverAddress).isReachable(1000);

Is this a reliable method? I'm confused by the line:

InetAddress.getByName(serverAddress).isReachable(1000);

What's that for - would it work if I'm testing on "localhost" (ie not a real networked example, just one machine)? thanks

4

2 に答える 2

2

いずれもまったく役に立ちません。このisConnected()メソッドは、connect()(暗黙的または明示的に)呼び出したのかaccept()、;を介してソケットを受け取ったのかを示します。このisClosed()メソッドは、あなたがこれまでに電話したかどうかを教えてくれますclose()。このisReachable()メソッドは、ホストが到達可能かどうかを通知するだけであり、呼び出しが成功するたびに追加のTCP接続のセットアップとティアダウンが発生します。

接続の状態とは何の関係もありませ。TCP接続でエラーを検出する唯一の信頼できる方法は、TCP接続に書き込もうとすることです。

于 2013-03-19T02:07:07.713 に答える
2

「相手が死んだ場合」が何を意味するかによります。

まず、isConnected()電話はダメです。これは単に、Socket が過去のある時点で接続されていたかどうかを尋ねます。限目。

第二に、isClosed()電話は役に立たない。

第三に、isReachable()呼び出しはほとんど役に立ちません。サービスのホストが稼働中であり、基本的なネットワーク レベルで到達可能であることをある程度保証します。(具体的には、ICMP Ping パケットがホストに到達し、応答が戻ってきていることを示します。) ただし、これは、サービスへの TCP/IP 接続が有効かどうか、またはサービス自体が有効かどうかを示しません。まだ正常に機能しています。実際、ホストは Ping パケットに応答し、サービスへの接続の試行を拒否または無視することができます。

実際、サービスが (有用な意味で) 本当に有効であることを確認する唯一の方法は、実際に使用してみることです。これが何を意味するかは、サービスの性質によって異なります。典型的な同期サービスの場合、要求「メッセージ」をソケット出力ストリームに書き込み、入力ストリームから応答「メッセージ」を読み取ろうとします。(書き込みを読み取るときは、必ずタイムアウトを使用する必要があります...):

  • サービスが終了したか、TCP/IP 接続が切断された場合は、SocketException などを取得する必要があります。(ただし、TCP/IP 接続が切断されたからといって、サービスが停止しているとは限らないことに注意してください。単純に再接続する必要がある場合もあります。)
  • サービスが「スタック」している場合、書き込みまたは読み取りでタイムアウトが発生する可能性があります。
  • ネットワークの問題がある場合、タイムアウトが発生するか、何らかの SocketException が発生する可能性があります。

上記のいずれも発生しない場合は、サービスが「有効」であることを示していますが、送信した種類のリクエストに対してのみ「有効」である可能性もあります。

明らかに、応答が期待どおりであることも確認する必要があります。たとえば、リクエストごとに 501 または 503 レスポンスを送信する HTTP サービスは、有用な意味で有効ではありません。


それは何のためですか - isReachable「localhost」でテストしている場合 (つまり、実際のネットワーク化された例ではなく、1 台のマシンのみ) は機能しますか?

それに対する明確な答えはないと思います。OS がループバック ネットワーク アドレスで ICMP プロトコルをサポートしているかどうかによって異なります。私の知る限り、ループバックでの ICMP の実際のユースケースはないため、機能するとは思わないでしょう。

于 2013-03-19T03:34:39.217 に答える