Java 如何测试远程系统是否可访问

Java 如何测试远程系统是否可访问,java,networking,Java,Networking,我想测试是否可以使用Java访问远程系统,或者换句话说,使用Java“发送ping”。例如,此功能应封装在具有布尔值的方法中 public boolean isReachable(String ip) { // what to do :-) } 我已经测试了Java Process类,但我认为这不是最好的方法,因为OutputBuffers具有复杂的输出处理 Process proc = Runtime.getRuntime().exec("ping " + ip); 另一种可能是创建

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

public boolean isReachable(String ip) {
   // what to do :-)
}
我已经测试了Java Process类,但我认为这不是最好的方法,因为OutputBuffers具有复杂的输出处理

Process proc = Runtime.getRuntime().exec("ping " + ip);
另一种可能是创建套接字连接并处理抛出的异常,但如果远程系统是“裸”unix系统,则另一端可能没有套接字:-)此外,我希望能够在无法访问远程系统时设置超时


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

InetAddress.getByName(主机).isRecable(超时)
(请参阅)

看起来您正在使用Linux,因此您可能会发现isRecable()不可靠(因为您没有发送ICMP数据包的权限,而且很少有服务器运行Echo服务)

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

   ping -c 1 hostname
这将在一次尝试后终止,然后您可以检查流程的退出状态—比解析标准输出更可靠


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

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


无法信任isReachable()可靠地ping本地子网之外的主机。最可能的原因是windows正在使用ICMP ping,而isReachable()无法使用它。至少在Java 6中是这样。本机
isReachable0
方法实现(在
Inet4AddressImpl.c中)中有一条评论说,“ICMP和原始套接字的Windows实现目前太不可靠。因此,最好不要尝试,而只依赖TCP。我们可能在将来重新访问并启用此代码。”
已确认,在我的WXP测试机器中,此命令默认为端口7(echo)上的TCP连接。即使对于不存在的IP,或者防火墙被阻止,它也会返回reachable.OMG!非常感谢:-)正是我想要的!我们是否可以检查是否可以访问特定端口?在您无法完全控制权限、防火墙等的生产设置中,不应使用此功能。。看:漂亮,简单,干净。非常感谢你的建议!我将在bugtracker中创建一个条目作为“改进”:-)用于什么目的?如果您想连接到某个服务器,请尝试连接。
   ping -c 1 hostname
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;
}