4

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

1) HTTP HEAD リクエストは ping と同じくらい信頼できますか? Ping は、何かが利用可能かどうかを確認するための私の最初の自然な選択です。コマンドラインで実行するのがとても簡単だからかもしれません。

2) HTTP HEAD リクエストをサードパーティの Web サイトに送信してアクセス可能かどうかを確認する場合、これらを送信する標準的な頻度はありますか? たとえば、私が毎秒それらを送信した場合、それは落胆したり、それらのサービスからブロックされることさえありますか?

4

3 に答える 3

5

通常、HTTP HEAD は ping よりも信頼性が高くなります。これは、ICMP 接続がブロックされることが多く、HTTP が通常開いているためです。毎秒接続をチェックするのはかなり過剰に聞こえますが、「ping」しようとしているサードパーティのサイトのユースケースによって異なります。

于 2011-07-31T16:24:37.640 に答える
4

HEADを使用する方が効果的か、システムにドロップしてpingを実行するなどのことを試みる方が効果的かについてはコメントできません。しかし、どちらもあなたがすべき解決策ではないと思います。IMHO、接続をポーリングする必要はありません。接続が切断される状況はたくさんありますが、ポーリングによって問題が軽減されるとは思えません。また、ユーザーがイライラすることもあります。アプリケーションを使用していて、何か他のことを始めた場合、突然、注意を払っていなかったアプリケーションから「接続がサードパーティのエラーで失われました」というメッセージが表示された場合、私は知っています。私はとてもイライラするでしょう。

アプリケーションが存在する接続に依存している場合は、例外ハンドラーでこれを処理するのが適切だと思います。ネットワーク アクションを試みて接続を確立できないときはいつでも、使用している API が何らかの例外をスローすることは間違いありません。したがって、ネットワーク アクションを初期化するクラスに関係なく、次のパラダイムに従います。

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

アプリケーションは、接続がいつ失われたかを判断できないようにする必要があります。ネットワーク アクションを試みて接続が見つからない場合にどのように反応するかだけです。

そうは言っても、あなたはまだ私に同意しないかもしれません. その場合、許可/推奨されるポーリングの頻度は、使用しているサービスの API に記載されている可能性があります。また、サード パーティのリソースが静的な場合は、何度も取得するのではなく、キャッシュする必要があります。

于 2011-07-31T16:32:54.430 に答える
3

@Dave's answerを拡張したかったのですが、コメントでは不十分です。

  1. インターネット接続が失われると、 ajava.io.IOExceptionがスローされます。IOException のサブクラスを見てください。
  2. 例外を処理するための中心的な場所を作成します (これはそれ自体が良い方法です)。上記の IOException のいずれかが発生した場合は、isInternetAvailable を false に設定します。
  3. インターネット接続をポーリングする代わりに、実行したい操作を再試行するように切り替えます。あなたは同じことを達成します
  4. バックオフ戦略を使用してください - 指数バックオフはうまく機能します。たとえば、最初に失敗した後、5 秒間待機します。2 回目の失敗の後、25 秒間待機します。Gmail Web アプリケーションはこの戦略を使用します。Twitter commons には backoff のユーティリティ クラスがあります
于 2011-08-01T02:10:46.077 に答える