【问题标题】:How to test if a remote system is reachable如何测试远程系统是否可达
【发布时间】:2011-12-02 21:09:07
【问题描述】:

我想测试是否可以使用 Java 访问远程系统,或者换句话说,使用 Java“发送 ping”。此功能应封装在具有布尔值的方法中,例如

public boolean isReachable(String ip) {
   // what to do :-)
}

我已经测试了 Java Process 类,但我认为这不是最好的方法,因为使用 OutputBuffers 处理复杂的输出。

Process proc = Runtime.getRuntime().exec("ping " + ip);

另一种可能性是创建一个套接字连接并处理抛出的异常,但如果远程系统是一个“裸”的 unix 系统,另一端可能没有套接字 :-) 另外,我希望能够当远程系统无法访问时设置超时。

那么我该怎么做呢?谢谢!

【问题讨论】:

  • 出于什么目的?如果那里有您要连接的服务器,请尝试连接。

标签: java networking


【解决方案1】:
InetAddress.getByName(ip).isReachable(timeout);

【讨论】:

  • 天啊!非常感谢 :-) 正是我想要的!
  • 能否检查特定端口是否可达?
  • 这个函数不应该用在你不能完全控制权限、防火墙等的生产环境中。见:stackoverflow.com/questions/9922543/…
  • 漂亮、简洁、干净。
【解决方案2】:

InetAddress.getByName(host).isReachable(timeOut)(见here

【讨论】:

  • isReachable() 不能可靠地 ping 本地子网之外的主机。最可能的原因是 windows 使用 ICMP ping 而 isReachable() 未能使用它。至少 Java 6 是这种情况。
  • 原生isReachable0方法实现中有注释(在Inet4AddressImpl.c) which says "Windows implementation of ICMP & RAW sockets is too unreliable for now. Therefore it's best not to try it at all and rely only on TCP. We may revisit and enable this code in the future."
  • 已确认,在我的 WXP 测试机器中,此命令默认为端口 7 上的 TCP 连接(回显)。即使对于不存在的 IP 或防火墙被阻止,它也会返回可达。
【解决方案3】:

看起来你使用的是 Linux,所以你可能会发现 isReachable() 不可靠(因为你没有发送 ICMP 数据包的权限,并且很少有服务器运行 Echo 服务) .

如果是这种情况,那么我认为您需要按照您建议的方式使用 spawn a Process,但我建议使用如下命令:

   ping -c 1 hostname

这将在一次尝试后终止,然后您可以检查进程的退出状态 - 比解析标准输出可靠得多。

Ping 成功返回 0,失败时返回非零。

【讨论】:

  • 非常感谢您的建议!我将在 bugtracker 中创建一个条目作为“改进”:-)
【解决方案4】:

我知道这个问题已经找到了答案,但我想添加我的代码只是为了“复制粘贴”。

public boolean isIpReachable(String ip, int timeout){
    boolean state = false;

    try {
        state = InetAddress.getByName(ip).isReachable(timeout);
    } catch (IOException e) {
        //Parse error here
    }

    return state;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2019-01-22
    • 2017-02-06
    • 1970-01-01
    • 2023-03-26
    • 2021-09-06
    相关资源
    最近更新 更多