gpt4 book ai didi

java - InetAddress.getByName(host).isReachable(timeout) 的最佳替代方案

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:37:10 31 4
gpt4 key购买 nike

我正在尝试联系主机并获得以下代码

if(!InetAddress.getByName(host).isReachable(TIMEOUT)){
throw new Exception("Host does not exist::"+ hostname);
}

我可以从 Windows ping 的主机名,也对其进行了 tracert,它返回了所有数据包。但是 java 抛出异常“主机不存在::”;

我试验的超时值从 2000 毫秒到 5000 毫秒。我也试过3000。我无法理解这个问题的原因是什么。我在网上进行了研究,有人说 InetAddress.getByName(host).isReachable(time) 不可靠并且根据内部系统运行。

如果这是真的,最好的选择是什么。请提出建议。

最佳答案

要么打开一个你认为开放的端口的 TCP 套接字(Linux 为 22,Windows 为 139,等等)

public static boolean isReachableByTcp(String host, int port, int timeout) {
try {
Socket socket = new Socket();
SocketAddress socketAddress = new InetSocketAddress(host, port);
socket.connect(socketAddress, timeout);
socket.close();
return true;
} catch (IOException e) {
return false;
}
}

或者使用一些 hack 来发送实际的 ping。 (灵感来自这里:http://www.inprose.com/en/content/icmp-ping-in-java)

public static boolean isReachableByPing(String host) {
try{
String cmd = "";

if(System.getProperty("os.name").startsWith("Windows"))
cmd = "cmd /C ping -n 1 " + host + " | find \"TTL\"";
else
cmd = "ping -c 1 " + host;

Process myProcess = Runtime.getRuntime().exec(cmd);
myProcess.waitFor();

return myProcess.exitValue() == 0;
} catch( Exception e ) {
e.printStackTrace();
return false;
}
}

可以找到适用于 Android 的相同 hack here :

关于java - InetAddress.getByName(host).isReachable(timeout) 的最佳替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18321118/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com