2012-07-20 105 views
3

所以我一直在使用isReachable为“平”的地址在我的Java代码。这个代码块是每个人都似乎使用:isReachable总是返回true不管IP地址是什么

try 
    { 
    InetAddress address = InetAddress.getByName("172.16.2.0"); 
    // Try to reach the specified address within the timeout 
    // periode. If during this periode the address cannot be 
    // reach then the method returns false. 
    boolean reachable = address.isReachable(10000); 
    System.out.println("Is host reachable? " + reachable); 
    } catch (Exception e) 
    { 
    e.printStackTrace(); 
    } 

我的问题是,不管我用我的IP地址,它总是返回true。即使我将其更改为空字符串。任何想法为什么?

+0

你使用Java 1.5?一个错误报告已经打开:http://bugs.sun.com/view_bug.do?bug_id=5067312。现在已经解决了,所以如果您使用的是1.5版本,请尝试使用更新的Java版本。 – 2012-07-21 10:09:53

回答

2

检查是否一些地址可达的一种方法,通过java.net.InetAddress.isReachable()方法。 这些方法的实现本地化,并尽力“ping”InetAddress表示的地址。

令人惊讶的是Windows和在Linux/Unix实施java.net.InetAddress.isReachable()之间有许多不同之处。

的Windows,因为它似乎奇怪,不正式支持ICMP的“ping”系统调用。因此,Java SE 5实现尝试在端口7(echo服务)上打开一个TCP套接字并希望得到某种回复。

的Linux/Unix,而是支持一个ICMP的 “ping” 系统调用。因此,java.net.InetAddress.isReachable()的实现首先尝试执行“ping”系统调用;如果失败,它会回退尝试在端口7上打开TCP套接字,就像在Windows中一样。

事实证明,在Linux/Unix中,ping系统调用需要root权限,所以大多数情况下java.net.InetAddress.isReachable()都会失败,因为许多Java程序不是以root身份运行的。

正确的做法是ICMP协议。这是ping在内部使用的。建议参见THIS收集知识并继续。

FROM:Simone Bordet's Blog