作为一项任务,我必须找到局域网上所有活着的计算机。我正在使用isReachable
类的InetAddress
函数。但问题是没有任何东西可以显示给我。所以我试图让isReachable
使用Google的IP,但仍然无法访问。
以下是代码:
import java.net.*;
public class alive{
public static void main(String args[]){
try{
InetAddress ia = InetAddress.getByAddress(new byte[]{(byte)209, (byte)85, (byte)153, (byte)104});
boolean b = ia.isReachable(10000);
if(b){
System.out.println("Reachable");
}
else{
System.out.println("Unrachable");
}
}catch(Exception e){
System.out.println("Exception: " + e.getMessage());
}
}
}
输出为:Unreachable
答案 0 :(得分:5)
以下是有关为什么isReachable()可能无法始终按预期工作的一些细节
正确的方法是使用ICMP协议。我相信这就是 ping 使用internatlly的原因。 Here is an example让你开始。
答案 1 :(得分:3)
以下是与平台无关的代码,但需要有关其他计算机上任何开放端口的信息(我们大多数时间都是这样)。
private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
// Any Open port on other machine
// openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc.
try {
try (Socket soc = new Socket()) {
soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
}
return true;
} catch (IOException ex) {
return false;
}
}
答案 2 :(得分:2)
我找到了有趣的解决方案。如果您不能以root用户身份运行应用程序,则可以在java上设置原始套接字功能:
sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java
然后将使用ICMP协议而不是7 TCP端口上的echo请求。