2009-03-13 21 views
8

url.openStream()から例外をキャッチしたときにインターネットが利用できないという難しい方法を伝えたくありません。Javaでインターネットの可用性をテストするにはどうすればよいですか?

コンピュータがJavaでインターネットに接続されているかどうかを確認する簡単な方法はありますか? このシナリオでは、「インターネットに接続する」とは、特定のURLからデータをダウンロードできることを意味します。

私がそれからダウンロードしようとすると、それが利用できない場合、プログラムはちょっとハングします。私はそのぶら下がりを望んでいない。したがって、私はウェブサイトが利用可能であるかどうかを問い合わせる迅速な方法が必要です。

答えて

10

回避しようとしている問題は、アクセスしようとしているURLが実際に利用できないと判断するためにhttp接続を待っていることです。これを実現するには、openConnection()。getInputStream()のショートカットであるurl.openStream()の使用をやめ、接続を細かく制御する必要があります。

URLConnection conn = url.openConnection(); 
conn.setConnectTimeout(timeoutMs); 
conn.setReadTimeout(timeoutMs); 
in = conn.getInputStream(); 

このコードは、接続または読み込みのいずれかを使用すると、timeoutミリ秒ののparamaterで提供時間を超えた場合は、接続試行をタイムアウトすることができます。

+0

これは単なる平凡な解決策です。糸。 – Chii

+0

あなたはより良いものを提案できますか?私はすでに別のスレッドを使用してデータをダウンロードしています。 – Penchant

2

コンパイターがネットワークに接続されているかどうかを知ることはできますが、ネットワークが動作しているかどうか、またはインターネットに接続されていることが保証されていない場合でも、

これは「吸うと見える」問題の1つです。

接続しようとすると何が問題になりますか?そして、彼らがインターネットに接続しているかどうか、なぜあなたは懸念していますか?

4

「インターネットの可用性」のようなものはありません。 HTTPリクエストが透過的なHTTPプロキシを通過し、ブラックリストに載っているサイトにアクセスしようとしているときに、アクセスが拒否されたことを示すプロキシサーバーからのHTTP応答を取得したとします。このシナリオでインターネットを利用できるかどうか

私はあなたの問題についてより具体的になると思います。

+0

これは素晴らしい答えと重要なポイントです。 – jayunit100

0

はあなたのファイアウォールがは禁止していない場合は、NTP serverを確認することができ

+0

多くのネットワーク、特に企業ネットワークは、ICMPトラフィックをブロックします。 – cletus

+0

@cletus彼は非常に "よく知られている"と言っています。だから、ICMPトラフィックを許可するホストでなければなりません:) – rogeriopvl

0

...非常によく知られているホストにICMPメッセージを送信することができます。

どのような方法でも、最も一般的に開かれるサービスであるため、避けようとするとURLを開くことをお勧めします。

常に変化する1つまたは2つの動的URLを確認できます。インスタントのために、時間を示すいくつかのウェブ。例えばthis one私はgoogleingを見つけました。サイトがダウンする可能性があるため複数になる可能性があります;-)

1

Javaで利用可能な低レベルのHTTP配管についてはよく分かりませんが、事前にURLのhttp HEADリクエストを発行できます。これにより、サーバーはヘッダーのみを返信し、データは返送しません。 1-3秒のタイムアウトを設定すると、長時間の遅延を避けることができます。

2

基準が、特定のWebサーバーにアクセスできるかどうかを調べる唯一の方法は、そのWebサーバーにアクセスすることです。

ただし、起動時にバックグラウンドスレッドで実行することで、アプリケーションが遅れないようにすることができます。実際のダウンロードが必要な場合は、「はい/いいえ」の回答を使用できます。あなたがプログラムが開始されたときに接続されていない場合、ユーザは何が起きているのかを知るためにステータス行にメッセージを入れてください。

1

ダウンロードを待っている間にプログラムがハングしている場合は、おそらくGUIスレッドを使用してダウンロードを行っている可能性があります。バックグラウンドスレッドを使用すると、タイムアウト/ダウンロードに時間がかかる場合でもプログラムはハングしません。

5

使用

Process p1 = java.lang.Runtime.getRuntime().exec("ping www.google.com"); 
System.out.println(p1.waitFor()); 
// return code for p1 will be 0 if internet is connected, else it will be 1 
+0

Naga Rishi。ありがとうございました。いい答えだ。 – pudaykiran

関連する問題