2011-08-19 8 views
7

Javaにネットワークカードが接続されていないことを検出できるAPI(NetworkInterface、InetAddressなど)があります。ネットワークカードがJavaに遅れずに接続されていない場合、どうすれば検出できますか?

問題は、ネットワークAPIの一部に対処すると大きなタイムアウトが発生することです。しかし、ネットワークカードがどのケーブルにも接続されていなければ、それをスキップすることができます。問題は、あなたが

sun.net.client.defaultConnectTimeout 

all properties here

を使用してソケット接続のデフォルトの時間を設定するには、いくつかのJavaシステムプロパティを使用することができる唯一のWindows 7の

+0

多くのタイムアウト設定はJVMレベルで制御できます(Snicolasの応答を参照)。他の人は、あなたはOSレベルでそれらを設定しなければなりません。そして、それらをあなたのJavaアプリケーションのためのOSレベルの「前提条件」にしなければなりません。たぶん私はあなたの問題を誤解しているかもしれませんが、ある時点で、JVMの配備は根底にあるOSによって何が提供されているかについていくつかの仮定をしなければならないと思います。良い質問ですが(あなたのために+1)。 –

答えて

1

で発生するようです。しかし、それはいるようです特定のミディアムアクセスコントローラが存在するかどうかを確認することは、根底にあるOSの仕事です。私はWindows 7について多くのことを話すことができない、私は12年(Linux)以来良いOSを得た。

よろしく、 ステファン

+0

私はこの点についてあなたに同意します(これはJVMのものではなく、OSレベルのタスクです)。OTHでは、コンテナやフレームワークを実装している場合にJVMレベルでこれを行うことを試みるケースがありますアプリケーションレベルとシステムレベルの期待値の間の線がぼやけてしまいます) –

+0

タイムアウトを変更することは役に立ちません。短すぎると、実際の接続遅延が発生するとタイムアウトになります。しかし、ネットワークに接続できない状況(ネットワークカードを持たないなど)があり、質問者はすぐにそれを検出したいと考えています。 – DJClayworth

2

私はこの同じ問題を抱えていました。私はこれを使用して終了:

Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces(); 
     while(eni.hasMoreElements()) { 
      Enumeration<InetAddress> eia = eni.nextElement().getInetAddresses(); 
      while(eia.hasMoreElements()) { 
       InetAddress ia = eia.nextElement(); 
       if (!ia.isAnyLocalAddress() && !ia.isLoopbackAddress() && !ia.isSiteLocalAddress()) { 
        if (!ia.getHostName().equals(ia.getHostAddress())) 
         return true; 
       } 
      } 
     } 

Java 5+で動作します。また、間接的にDNSをチェックします(名前とアドレスを比較して)。

+0

問題は、ネットワークカートが接続されていない場合、getHostName()が約5秒間ブロックすることです。 – Horcrux7

+0

それは私のためではありません。接続されていない場合、ホスト名はホストアドレスと同じです。編集:再び、私はIPv6のスタックをチェックしているので、私はIPv4の動作についてはわからない...私はそれも同じだろうと思うだろう。 – BenCole

関連する問題