如何检查Java中是否存在Internet连接?

Chr*_*ris 58 java connection networking

你如何检查你是否可以通过java连接到互联网?一种方法是:

final URL url = new URL("http://www.google.com");
final URLConnection conn = url.openConnection();
... if we got here, we should have net ...
Run Code Online (Sandbox Code Playgroud)

但是,是否有更适合执行该任务的东西,特别是如果您需要经常进行连续检查并且极有可能丢失互联网连接?

Jon*_*eet 46

您应该连接到实际应用程序所需的位置.否则,您正在测试您是否与某个无关的地方有联系(在这种情况下为Google).

特别是,如果您正在尝试与Web服务进行通信,并且如果您可以控制Web服务,那么拥有某种廉价的"获取状态"Web方法将是一个好主意.通过这种方式,您可以更好地了解您的"真实"通话是否可行.

在其他情况下,只打开一个应该打开的端口的连接可能就足够了 - 或者发送ping.InetAddress.isReachable可能是适合您需求的API.

  • 如果连接到要与之通信的资源并且失败,该怎么办?你怎么知道这是目标服务器的问题而不是bcs没有互联网连接?所以'连接到您的实际应用需要的地方'实际上并不是一个不可靠的检查解决方案 (14认同)
  • @Chris:这取决于你是否真的关心问题所在.我同意,如果(在失败之后)您可以连接到其他地方,您可以获得更多诊断信息.但最重要的信息肯定是"我可以使用我想要使用的资源吗?" (4认同)
  • isReachable的链接转到了错误的类.它位于http://java.sun.com/javase/6/docs/api/java/net/InetAddress.html#isReachable (3认同)
  • @Pacerier:有很多不同的东西可能出错,并且诊断*哪里*有问题是一个棘手的问题.如果你没有做任何事情,但你的ISP对世界其他地方的管道已经下降了怎么办?然后,您可能仍然拥有完全有效的路由器连接等 - 您甚至可以访问您的ISP域 - 但无法访问其他站点.我所说的只是"我的网络上线了吗?" 作为一个问题没有意义,真的 - 不是精确的.你提出的测试应该是什么? (2认同)

Mar*_*tus 20

您基本上提供的代码,加上调用connect应该足够了.所以,是的,可能只是谷歌不可用,但你需要联系的其他网站,但有多大可能?此外,此代码只应在您实际无法访问外部资源时执行(在一个catch块中尝试找出导致失败的原因)所以我会说如果您感兴趣的外部资源 Google都没有可用的机会是你有网络连接问题.

private static boolean netIsAvailable() {
    try {
        final URL url = new URL("http://www.google.com");
        final URLConnection conn = url.openConnection();
        conn.connect();
        conn.getInputStream().close();
        return true;
    } catch (MalformedURLException e) {
        throw new RuntimeException(e);
    } catch (IOException e) {
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*n C 17

人们建议使用INetAddress.isReachable.问题是某些站点配置其防火墙以阻止ICMP Ping消息.因此,即使Web服务可访问,"ping"也可能会失败.

当然,反过来也是如此.即使Web服务器已关闭,主机也可能会响应ping.

当然,由于本地防火墙限制,计算机可能无法直接连接到某些(或所有)Web服务器.

根本问题是"可以连接到互联网"是一个定义不明确的问题,如果没有这样的事情很难测试:

  1. 有关用户机器和"本地"网络环境的信息,以及
  2. 有关应用程序需要访问的信息.

因此,一般来说,最简单的解决方案是让应用程序只是尝试访问它需要访问的任何内容,并依靠人工智能来进行诊断.

  • 这是我的观点."有互联网"的问题是不明确的.阅读上面的文字,了解用于说明这一点的示例. (4认同)

Kut*_*tzi 7

如果您使用的是java 6,可以使用NetworkInterface检查可用的网络接口.就是这样的:

Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
  NetworkInterface interf = interfaces.nextElement();
  if (interf.isUp() && !interf.isLoopback())
    return true;
}
Run Code Online (Sandbox Code Playgroud)

还没有尝试过.

  • 这仅检查接口是否已启用。它不检查互联网连接。 (2认同)

Mor*_*hai 7

这段代码:

"127.0.0.1".equals(InetAddress.getLocalHost().getHostAddress().toString());
Run Code Online (Sandbox Code Playgroud)

返回 - 对我来说 - true如果离线false,否则.(好吧,我不知道这对所有电脑都是如此).

这比其他方法的工作速度快得多.


编辑:我发现这只有工作,如果用于互联网连接的"翻转开关"(在笔记本电脑上)或其他一些系统定义的选项,是关闭的.也就是说,系统本身知道不寻找任何IP地址.


Bul*_*aza 6

此代码应该可靠地完成工作.

请注意,使用该try-with-resources语句时,我们不需要关闭资源.

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

public class InternetAvailabilityChecker
{
    public static boolean isInternetAvailable() throws IOException
    {
        return isHostAvailable("google.com") || isHostAvailable("amazon.com")
                || isHostAvailable("facebook.com")|| isHostAvailable("apple.com");
    }

    private static boolean isHostAvailable(String hostName) throws IOException
    {
        try(Socket socket = new Socket())
        {
            int port = 80;
            InetSocketAddress socketAddress = new InetSocketAddress(hostName, port);
            socket.connect(socketAddress, 3000);

            return true;
        }
        catch(UnknownHostException unknownHost)
        {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Shi*_* EC 6

InetAddress.isReachable如果存在互联网连接,有时会返回 false。

在 java 中检查互联网可用性的另一种方法是:此函数进行真正的ICMP ECHOping。

public static boolean isReachableByPing(String host) {
     try{
                String cmd = "";
                if(System.getProperty("os.name").startsWith("Windows")) {   
                        // For Windows
                        cmd = "ping -n 1 " + host;
                } else {
                        // For Linux and OSX
                        cmd = "ping -c 1 " + host;
                }

                Process myProcess = Runtime.getRuntime().exec(cmd);
                myProcess.waitFor();

                if(myProcess.exitValue() == 0) {

                        return true;
                } else {

                        return false;
                }

        } catch( Exception e ) {

                e.printStackTrace();
                return false;
        }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ams 5

我通常将其分为三个步骤。

  1. 我首先看看是否可以将域名解析为IP地址。
  2. 然后我尝试通过 TCP(端口 80 和/或 443)进行连接并正常关闭。
  3. 最后,我将发出一个 HTTP 请求并检查是否有 200 响应返回。

如果在任何时候失败,我都会向用户提供适当的错误消息。

  • 我认为这可能是一个很好的答案,但你能否详细说明一下,因为现在这不是一个好的答案。 (2认同)