InetAddress类中的isReachable问题

作为一项任务,我必须在局域网上找到所有活着的计算机。 我正在使用的是InetAddress类的isReachable函数。 但问题是没有任何东西可以显示给我。 所以我尝试使用Google的IP进行isReachable ,但仍然无法访问。

这是代码:

 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

以下是有关为什么isReachable()可能无法始终按预期工作的一些详细信息

  1. http://bordet.blogspot.com/2006/07/icmp-and-inetaddressisreachable.html
  2. http://www.coderanch.com/t/206934/sockets/java/InetAdress-isReachable-Ping-Permissions

正确的方法是使用ICMP协议。 我认为这就是ping使用internatlly。 这是一个让你入门的例子 。

我发现有趣的解决方案 如果您无法以root用户身份运行应用程序,则可以在java上设置原始套接字function:

 sudo setcap cap_net_raw=ep /usr/lib/jvm/jdk/bin/java 

然后将使用ICMP协议而不是7 TCP端口上的echo请求。

以下是与平台无关的代码,但需要有关其他计算机上任何开放端口的信息(我们大多数时间都是这样)。

 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; } }