7

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

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

我曾尝试使用 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");
}

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

谢谢

4

2 回答 2

20

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

如果您出于某种原因需要监控 Internet 的可用性,即使您不打算使用它并且不知道要连接到谁,也可以尝试连接到已知良好的网站(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) {}
    }
}
于 2013-06-09T07:55:52.303 回答
11

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

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

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

于 2013-06-09T07:43:55.657 回答