2011-07-31 8 views
3

私は定期的にサーバーにアクセスしようとすることでインターネットに接続しているかどうかを確認する機能を持つJavaアプリケーションを作成しています。私の最初のアイデアはサーバをPingすることでしたが、Javaで実現するのは難しいと判明しました。だから私はそれを作り直してHTTP HEADリクエストを送信し、代わりにHTTPレスポンスコードをチェックします。私は2つの質問があります:Ping vs HTTP HEAD

1)HTTP HEAD要求はpingとして「信頼できる」ですか? Pingは、何かが利用可能かどうかを確認する最初の自然な選択です。たぶんコマンドラインで実行するのが簡単だからです。

2)HTTP HEADリクエストを第三者のWebサイトに送信してアクセス可能かどうかを確認するには、標準の頻度で送信する必要がありますか?例えば、毎秒送ってもらえないのか、それとも落胆してしまいますか?

+1

「サードパーティのウェブサイト」とは、自分が所有しているサイトか、ランダムなサイトですか?そういった人のサイトにpingをしないでください。それは[トラブル](http://en.wikipedia.org/wiki/NTP_server_misuse_and_abuse)を引き起こす可能性があります。 –

答えて

5

一般に、HTTPヘッダーは、ICMP接続がしばしばブロックされHTTPが通常開かれるため、pingよりも信頼性が高くなります。毎秒の接続性をチェックするのは非常に過度に聞こえますが、実際にはどのようなサードパーティのサイトで「ping」しようとしています。

+1

OPTIONSリクエストは、最初にルックアップする必要がある(長さなどを取得する)リソースに関連付けられていないため、さらに優れています。 – pyroscope

4

私はHEADの使用が効果的かどうか、またはシステムに落としてpingを実行しようとするとコメントできません。しかし、私はどちらもあなたがしなければならない解決策だとは思わない。 IMHO、あなたの接続をポーリングする必要はありません。接続が切断される可能性のある状況がたくさんあります。ポーリングは問題を軽減する手段として多くのものを提供するとは考えていません。また、ユーザは悩まされるかもしれない。私は、アプリケーションを使用していて何か他のことをやっていて、突然私が注意を払っていなかったアプリケーションから「サードパーティーのエラーに接続が失われました」ということを知っています。私は非常に迷惑になるだろう。

アプリケーションが接続に依存している場合は、例外ハンドラでこれを処理することが公正だと思います。私はあなたがネットワークアクションを試み、あなたが接続を確立することができないときは、使用しているAPIが何らかの例外をスローすることを賭けて喜んでいます。だから、私は何だろうことは、あなたがネットワークアクションを初期化しているものは何でもクラスであり、私はこのパラダイムをたどる:

try { 
    performNetworkAction(); 
} catch (NoConnectionFoundException e) { 
    // handle the situation here 
} 

あなたのアプリケーションは、接続が失われた時にどれだけ反応するように、決定することができないはずネットワークアクションを試みても接続が見つからない場合

言われている - あなたはまだ私と同意見ではないかもしれません。その場合は、使用しているサービスのAPIに、許可されている/推奨されているポーリングの頻度が記録されている可能性があります。また、第三者からのリソースが静的である場合は、それを何度も何度も繰り返すのではなく、キャッシュする必要があります。

3

@Dave's answerを展開していますが、コメントでは不十分です。

  1. インターネット接続を失うと、java.io.IOExceptionがスローされます。 sub-classes of IOExceptionを参照してください。 - UnknownHostException、SocketException、およびProtocolExceptionは、通常、「No Internet Connection」の匂いがします。
  2. 例外を処理するための中央の場所を作成します(これは、それ自体が良い方法です)。上記のIOExceptionのいずれかが発生した場合は、isInternetAvailableをfalseに設定します。
  3. インターネット接続のポーリングの代わりに、実行する操作を再試行するに切り替えます。あなたは同じことを達成する
  4. バックオフ戦略を使用する - 指数バックオフはうまくいきます。たとえば、初めて失敗した後、5秒待つ。二度目の失敗の後、あなたは25秒待つ。 Gmailウェブアプリケーションはこの戦略を使用します。Twitter commons has utility classes for backoff
関連する問題