2

インターネットにアクセスするJavaデスクトップアプリケーションを開発しています。これはマルチスレッドアプリケーションであり、各スレッドは同じ作業を行います(つまり、各スレッドは同じThreadクラスのインスタンスです)。

現在、すべてのスレッドがインターネット接続をアクティブにする必要があるため、インターネット接続がアクティブかどうかを検出するメカニズムが必要です。

Q1。インターネット接続がアクティブかどうかを検出するにはどうすればよいですか?

Q2。このinternet-status-check-mechanismコードをどこに実装しますか?インターネットステータスを定期的にチェックするために別のスレッドを開始し、ステータスが1つの状態から別の状態に変化したときにすべてのスレッドに通知する必要がありますか?または、各スレッドにインターネットステータス自体をチェックさせる必要がありますか?

Q3。インターネットにアクセスするすべてのアプリケーションがこの問題に対処する必要があるため、この問題は非常に一般的な問題であるはずです。では、他の開発者は通常この問題にどのように対処しますか?

Q4。この問題に対処する優れたデモアプリケーションへの参照を教えていただければ、非常に役立ちます。

4

4 に答える 4

1

A1:私が知っている接続をチェックする唯一のプラットフォームに依存しない方法は、信頼できるホスト(例えばgoogle.com)に接続しようとすることです

A2:スレッドが接続に関する情報を取得する頻度によって異なります。スレッドが多く、毎秒接続をチェックする必要がある場合は、別のスレッドを使用することをお勧めします。

A3:問題を解決するためのプラットフォーム固有の方法があります。Javaを使用しているので、Javaに頼るべきではないと思います。

于 2010-04-16T11:31:10.833 に答える
1

多数の信頼できるホストへの接続を確認してください。すべてのホストに到達できない場合は、ホストがダウンしているよりも、インターネット接続がダウンしている可能性が高くなります。

于 2010-04-16T12:18:20.513 に答える
0

信頼できるホストをポーリングできると他の人が述べているように、別のオプションは、java.net.NetworkInterface クラスとそのメソッド isUp() を使用することです。簡単なデモンストレーション:

Enumeration<NetworkInterface> ifcs = NetworkInterface.getNetworkInterfaces();
while(ifcs.hasMoreElements()){
    NetworkInterface ifc = ifcs.nextElement();
    System.out.println(ifc.getDisplayName()+ " "+ifc.isUp());
}

インターフェイスが切断されている場合、isUp は false を返す必要があります。これによりすべてのインターフェースが提供されるため、 isLoopback() もチェックして、常にアップしている必要があるループバック インターフェースを無視できることに注意してください。この方法は、特に接続が遅い場合にホストをポーリングするよりも信頼性が高く、より「礼儀正しい」方法です。少なくとも、これを初期テストとして使用できます。インターフェースが稼働していると報告された場合は、ホストへの接続を試みることができます。

于 2010-04-16T14:45:29.370 に答える
0

オペレーティング システムに直接問い合わせることができない場合は、既知のホストへのソケット接続を作成できます。コンピュータ自体でインターネット接続がダウンすると、そのソケット接続が切断され、プログラムに通知されます。

「途中で」接続が失われたことを検出する必要がある場合は、ソケットで定期的にデータを受信し、このデータが「時間通りに」到着したかどうかを追跡する必要があります。そうでない場合、接続は応答しません。

于 2010-04-16T12:00:02.440 に答える