11

作为一项任务,我必须找到局域网上所有可用的计算机。我正在使用类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

4

3 回答 3

5

以下是有关为什么 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在内部使用的方法。这是一个让您入门的示例。

于 2011-01-24T06:57:54.237 回答
4

这是与平台无关的代码,但需要有关另一台机器上任何开放端口的信息(我们大部分时间都有)。

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;
    }
}
于 2015-12-11T18:47:47.427 回答
3

我找到了有趣的解决方案。如果您不能以 root 身份运行您的应用程序,您可以在 java 上设置原始套接字功能:

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

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

于 2015-07-03T15:00:49.380 回答