测试互联网是否在 Java?

Test is internet is on in Java?

我正在尝试编写一个简单的程序来测试我的互联网是否正常工作。但是,我目前得到的结果不准确。无论互联网状态如何,我得到的结果都是 互联网不可用。 求助?

注。此 post 将随着新发现的出现而更新,以帮助那些将来发现此 post 的人。
非常感谢 Andreas and Stehen C. 帮助解决了这个问题。
当前状态:已解决。参见编辑 3。


更新: Per Windows 可能无法使用此语法,因为 Windows “[无法] 发送ICMP 数据包”。此语法可能适用于 *nix 系统和 OSX。我无法测试这个。

我的原码:

import java.io.IOException;
import java.net.InetAddress;
public class ITIWApp 
{
    public static void main (String [] args) throws IOException
    {
        InetAddress gdns = InetAddress.getByName("8.8.8.8");

        boolean inetIsOn = gdns.isReachable(1000);

        if (!inetIsOn)
        {
            System.out.println("The internet is not available.");
        }
        else
        {
            System.out.println("The internet is available.");
        }
    }
}

编辑:根据@Andreas [link]:

,我也尝试过
Process p1 = java.lang.Runtime.getRuntime().exec("ping -c 1 www.google.com");
int returnVal = p1.waitFor();
boolean inetIsOn = (returnVal == 0);


if (!inetIsOn)
{
    System.out.println("The internet is not avaliable.");
}
else
{
    System.out.println("The internet is avaliable.");
}

相同的结果。

编辑 2: 我制作了这个批处理文件,只是为了确定。

@ECHO OFF
echo ITIW?
ping 8.8.8.8
java ITIWApp
pause

结果呢?当然我可以 ping 8.8.8.8 就好了,丢包率 0%,但是还是 The internet is not available. 这意味着:

编辑 3: 在 Windows 10,您必须登录超级机密管理员帐户才能在 [=15] 使用 -c 选项=].要访问此帐户,您必须在命令行中 运行 命令 net user administrator /active:yesFollow this tutorial here。感谢所有帮助过我的人。

因为你的IP地址不对。我在我的机器上试用了这段代码,它运行良好。再次交叉检查您的 IP 地址。

InetAddress.isReachable 的 javadoc 说:

"Best effort is made by the implementation to try to reach the host, but firewalls and server configuration may block requests resulting in a unreachable status while some specific ports may be accessible.".

而且您显然不能 "ping" 来自 Java 之外的主机这一事实也支持这一点。您的本地网络和/或 ISP 有问题。

更新

实际上,也可能是您的 Java 应用程序没有足够的访问权限来发送 ICMP 数据包。当我在我的机器上尝试您的 ITIWApp 程序时,我发现这是问题所在。它说 "The internet is unavailable" 当我 运行 它是我自己时,它说 "The internet is available" 当我 运行 它以 root 权限。

更新 2

显然您正试图 运行 在 Windows 上执行此操作。根据this answer, Java on Windows does not support ICMP. It is not a permissions issue on that platform. See also Java bug #8133015


(为了它的价值,我可以从这里 "ping" 8.8.8.8。但是当我尝试在端口 7 上使用 "telnet" 到 8.8.8.8 时,它超时。)

在 Windows 10,您必须登录到超级机密管理员帐户才能在 ping 上使用 -c 选项。要访问此帐户,您必须在命令行中 运行 命令 net user administrator /active:yesFollow this tutorial here. 感谢所有帮助过我的人。