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

str*_*rry 21 java networking

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

public boolean isReachable(String ip) {
   // what to do :-)
}
Run Code Online (Sandbox Code Playgroud)

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

Process proc = Runtime.getRuntime().exec("ping " + ip);
Run Code Online (Sandbox Code Playgroud)

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

那怎么能这样呢?谢谢!

and*_*ndy 44

InetAddress.getByName(ip).isReachable(timeout);
Run Code Online (Sandbox Code Playgroud)

  • 我们可以检查一个特定的端口是否可以访问? (5认同)

mic*_*667 9

InetAddress.getByName(host).isReachable(timeOut)(见此处)

  • 无法信任isReachable()以可靠地ping本地子网之外的主机.最可能的原因是Windows正在使用ICMP ping而isReachable()无法使用它.这至少是Java 6的情况. (6认同)
  • 在本机`isReachable0`方法实现中有一个注释(在`Inet4AddressImpl.c中),它说"现在ICMP和RAW套接字的Windows实现太不可靠了.因此最好不要尝试它,只依赖TCP.我们可能会在将来重新访问并启用此代码." ` (5认同)

Pau*_*ger 5

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

如果是这样的话,那么我想你会需要产卵在你建议的方式过程中使用,但我建议使用像这样的命令:

   ping -c 1 hostname
Run Code Online (Sandbox Code Playgroud)

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

Ping 在失败时返回 0 表示成功非零。