2017-12-04 2 views
2

インターネットに接続しているかどうかをリアルタイムで教えてくれる簡単なプログラムを書こうとしています。それはwww.google.comに達した場合に必要なメッセージを出力Javaでインターネット接続をテストするプログラム

import java.net.Socket; 

public class InternetConnection { 
    public static void main(String[] args) { 
     String inetAddress = "www.google.com"; 
     int port = 80; 

     while (true) { 
      try { 
       Socket socket = new Socket(inetAddress, port); 
       System.out.println("Connected to the internet"); 
      } catch (Exception e) { 
       System.out.println("Not connected to the internet"); 
      } 
     } 
    } 
} 

:これは私がやっているものです。しかし、インターネットから切断して正常に機能しているかどうかを確認するには、「はインターネットに接続されていません。」と表示されたら、「」と表示されますが、 「インターネットに接続しました」というメッセージが表示されます。私は何が間違っているのかわからない...

P.S.私はこれがインターネット接続があるかどうかをチェックする最良の方法ではないことを知っています。

+2

whileループに遅延を追加すると( 'Thread.sleep(1000);'はうまくいくはずです)どうしますか?あまりにも印刷しようとする可能性があり、メッセージを印刷するとすぐに – phflack

+1

から数分前にデータが印刷されてしまい、ソケットインスタンスが範囲外になる可能性があります。あなたのプログラムは完了しました。あなたを待っているわけではありません。 –

答えて

0

ソケットを作成して接続メッセージを印刷した後に遅延時間を設定します。

try { 
    Socket socket = new Socket(inetAddress,port); 
    System.out.println("Connected to the internet"); 
}catch(Exception e){  
    System.out.println("Not connected to the internet"); 
} 
TimeUnit.SECONDS.sleep(5); 

プログラムは意図した通りに動作するはずです。

+0

これがなぜこの問題を解決するのか説明できますか?最初の問題の原因は何でしたか? – Zabuza

+0

遅れなくても、プログラムの印刷データが速すぎて、コードが意図したとおりに反映されない可能性があります。 – Akjun

+0

うまくいきました。しかし、これをGUI(Swing)に適用すると、インターネットから切断してプログラムを実行すると、UnknownHostExceptionが発生します。私は本当にこの例外をキャッチする方法を知りません。私は試しました:} catch(UnknownHostException e)、Eclipseは赤で下線を引いています... – Alberto

0

プラグを接続してプルしようとすると、GoogleのDNSルックアップが失敗するため、UnknownHostExceptionが発生します。 「ホストするルートがない」場合は、直接スローされているはずです。あなたのコードでは、タイムアウト処理はありません。ソケットのコンストラクタ(https://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int)参照)に直接渡すことができる接続タイムアウトパラメータを使用してください。多くの問題が直接スローされます(詳細はこちらconnect() method ignoring its timeout valueなど)。また、あなたの1つのランタイムスレッドがトラブルの時にブロックされている、それだけでソケットとインターネット接続とトラブルがあり、あなたの

Socket socket = new Socket(inetAddress, port); 

、通常にハングアップします..あなたはで実行を終了することができるようにしたいです途中、おそらくあまりにも、あなたが制御された方法で停止することができ、おそらくあなたは「ただ眠っている」のではなく、テストのスケジュールを設定したいと思い、別のスレッドでも

private final static ScheduledExecutorService scheduler = 
Executors.newScheduledThreadPool(1); 
    .. 
     Runnable r =() -> { 
      try { 
       testConnections(); 
      } catch (InterruptedException | ExecutionException | TimeoutException e) { 
       // HANDLE IT 
      } 
     }; 
     scheduler.scheduleAtFixedRate(r, secondsInBetweenPolls, secondsInBetweenPolls, TimeUnit.SECONDS); 
     } 
    .. 

のようなものを、あなたのプログラムを実行制御、私が持っているでしょうCompletableFutureのために消えてしまいます。これは非ブロックであり、この種のものにはうってつけです。たとえば、ここにはhttp://www.deadcoderising.com/java8-writing-asynchronous-code-with-completablefutureという広告が表示されます。メインブロックは次のようになります

private void testConnections() throws InterruptedException, ExecutionException, TimeoutException { 
    for (URL u : urls) { 
     if (isRunning){ 
      try{ 
       CompletableFuture.supplyAsync(() -> testConnection(u)).acceptEither(timeoutAfter(millisConnectionTimeOut, TimeUnit.MILLISECONDS), result -> currentStatus = result).get(); 
      } catch (Exception e) { 
       if (e instanceof TimeoutException) { 
        currentStatus = Result.INTERNET_UNREACHABLE; 
       } 
      } 
      if (currentStatus.equals(Result.INTERNET_REACHED)) { 
       break; // first actual internet hit is enough, right? 
      } 
     } 
    } 
    notifyListener(); 
    lastStatus = currentStatus; 
} 

private void notifyListener() { 
    if (lastStatus == null || !currentStatus.equals(lastStatus)) { 
     if (currentStatus.equals(Result.INTERNET_REACHED)) { 
      listener.connectionIsUp(); 
     } else { 
      listener.connectionIsDown(); 
     } 
    } 
} 

private Result testConnection(URL url) { 
    if (isRunning) { 
     HttpURLConnection urlConnect = null; 
     try { 
      urlConnect = (HttpURLConnection) url.openConnection(); 
      urlConnect.setConnectTimeout(millisConnectionTimeOut); 
      int resultCode = urlConnect.getResponseCode(); 
      if (resultCode == 200) { 
       return Result.INTERNET_REACHED; 
      } 
     } catch (IOException ignore) {} 
    } finally { 
      if (urlConnect != null) { 
       urlConnect.disconnect(); 
      } 
     } 
    } 
    return Result.INTERNET_UNREACHABLE; 
} 
関連する問題