如何检查Java中的Internet连接

Ank*_*agi 6 java

我正在研究一个需要始终具有互联网连接的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");
}
Run Code Online (Sandbox Code Playgroud)

但是这段代码总是返回"否".这段代码有什么问题?

谢谢

may*_*Van 17

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

如果您出于某种原因需要监控互联网的可用性,即使您不打算使用它并且不知道您将连接到谁,只需尝试连接到已知良好的网站(谷歌. 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) {}
    }
}
Run Code Online (Sandbox Code Playgroud)


Raf*_*ele 9

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

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

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