【问题标题】:How to check internet connectivity in Java [duplicate]如何在 Java 中检查互联网连接 [重复]
【发布时间】:2013-06-09 07:35:58
【问题描述】:

我正在处理一个需要始终连接互联网的 Java 项目。

我希望我的程序每隔一段时间(比如 5 或 10 秒)继续检查互联网连接,并在未检测到互联网连接时立即显示一条消息。

我已经尝试使用isReachable方法来实现这个功能,下面是代码-

try
{
    InetAddress add = InetAddress.getByName("www.google.com");
    if(add.isReachable(3000)) System.out.println("Yes");
    else System.out.println("No");
}
catch (UnknownHostException e) 
{
    System.out.println("unkownhostexception");
} 
catch (IOException e) 
{
    System.out.println("IoException");
}

但此代码总是返回“否”。这段代码有什么问题?

谢谢

【问题讨论】:

标签: java


【解决方案1】:

如果您只是需要经常使用互联网,我同意 Raffaele 的建议。尝试去做,并准备在失败时处理异常。

如果您出于某种原因需要监控互联网的可用性,即使您不打算使用它并且不知道要连接到谁,也可以尝试连接到已知良好的网站(google.com、amazon.com、baidu.com...)。

这将适用于测试一些网站:

public static void main(String[] args) {
    System.out.println(
        "Online: " +
        (testInet("myownsite.example.com") || testInet("google.com") || testInet("amazon.com"))
    );
}


public static boolean testInet(String site) {
    Socket sock = new Socket();
    InetSocketAddress addr = new InetSocketAddress(site,80);
    try {
        sock.connect(addr,3000);
        return true;
    } catch (IOException e) {
        return false;
    } finally {
        try {sock.close();}
        catch (IOException e) {}
    }
}

【讨论】:

  • 是的,我正在做类似的事情。非常感谢!
  • 这工作,非常感谢。 testInet() 方法有什么用。
【解决方案2】:

我知道的唯一方法是将数据包发送到某个已知主机,在您知道的意义上已知,它将始终启动并运行并且可以从调用站点访问。

但是,例如,如果您选择命名主机,则 ping 可能会因 DNS 查找失败而失败。

我认为您不必担心这个问题:如果您的程序需要 Internet 连接,那是因为它发送或接收数据。连接不像河流那样是一个连续的概念,而更像是一条道路。因此,只需使用 Java 标准来处理连接错误:IOExceptiions。当您的程序必须发送数据时,底层 API 肯定会在网络中断的情况下抛出 IOE。如果您的程序需要数据,请使用超时或类似的方法来检测网络堆栈中可能存在的错误并将其报告给用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-30
    • 2012-03-23
    • 1970-01-01
    • 2016-04-03
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    相关资源
    最近更新 更多