Java程序,用于测试Internet连接

时间:2017-12-04 20:38:40

标签: java sockets

我试着写一个简单的程序,它实时告诉我是否有互联网连接。这就是我正在做的事情:

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");
            }
        }
    }
}

如果到达www.google.com,则打印出所需的消息。但是,如果我故意断开互联网以检查它是否有效,它会打印" 未连接到互联网"然后我重新连接并显示" 连接到互联网",但当我再次断开连接时,它仍会显示消息" 已连接到互联网"。我不知道自己做错了什么......

P.S。我知道这不是检查是否有互联网连接的最佳方式。

2 个答案:

答案 0 :(得分: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);

您的计划应按预期运作。

答案 1 :(得分:0)

您收到UnknownHostException,因为如果您尝试连接并拔出插件,则谷歌的DNS查找将失败。如果你没有#34;没有主办方的路线"它也应该直接抛出。在你的代码中,你没有超时处理,你应该至少使用你可以提供给你的Socket构造函数的连接超时参数(参见https://docs.oracle.com/javase/6/docs/api/java/net/Socket.html#connect(java.net.SocketAddress,%20int)),即使很多问题都会直接抛出(更多细节,例如这里{{ 3}})。此外,您的单个运行时线程在出现问题时会被阻止,它只会挂在您的

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,非常适合这种东西 - 你可以在这里阅读它:connect() method ignoring its timeout value。然后主要块可能是

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;
}