为什么Java InetAddress.isReachable()不能像在JRE 1.7.x上那样在JRE 1.8.x上工作

为什么Java InetAddress.isReachable()不能像在JRE 1.7.x上那样在JRE 1.8.x上工作,java,java-8,ip,java-7,inetaddress,Java,Java 8,Ip,Java 7,Inetaddress,一年前我写了一个程序,今天我看到这个程序给了我一些奇怪的输出。一种是检测网络中的PC或笔记本电脑,我使用InetAddress类。在Java 1.8.x在执行机器上运行之前,如果该IP地址上没有机器,那么InetAddress.isReachable()也会给我一个“TRUE” private String ipAddress = "192.168.1.200"; inetAddr = InetAddress.getByName(ipAddress); inetIsReachable = ine

一年前我写了一个程序,今天我看到这个程序给了我一些奇怪的输出。一种是检测网络中的PC或笔记本电脑,我使用InetAddress类。在Java 1.8.x在执行机器上运行之前,如果该IP地址上没有机器,那么InetAddress.isReachable()也会给我一个“TRUE”

private String ipAddress = "192.168.1.200";
inetAddr = InetAddress.getByName(ipAddress);
inetIsReachable = inetAddr.isReachable(8000);
debug += "   INET is reachable: " + inetIsReachable;
System.out.println(debug);
这真的很奇怪,我不知道如何检测这个错误

亲切问候普罗托

编辑

我试过这个密码。。。在Java1.7上运行

  inetAddr = InetAddress.getByName(ipAddress);
  inetIsReachable = inetAddr.isReachable(8000);
// FALSE
  byte[] a = new byte[]{(byte) 192,(byte) 168,1,(byte) 200};
  inetAddr = InetAddress.getByAddress("192.168.1.200", a);
  inetIsReachable = inetAddr.isReachable(8000);
// also FALSE

但是命令行上的一声ping到达了机器

编辑-2

Java1.8

192.168.1.200-InetAddress true-cmd ping true-有一台机器

192.168.1.202-InetAddress true-cmd ping false-没有机器

Java1.7

192.168.1.200-InetAddress false-cmd ping true-存在一台计算机


192.168.1.202-InetAddress false-cmd ping false-没有机器

这看起来像是8u73之后引入的。

要调试它,您需要使用Wireshark之类的工具来观察网络流量。您是否尝试过
getByAddress
而不是
getByName
?当您尝试在cmd/bash上ping该地址时,会看到什么?你有防火墙/防病毒软件吗?我曾经遇到过这样一个问题:一个杀毒软件只是在一台机器的任何端口上接受ssh/telnet,而不是其他方式。你只能建立连接,其余的都死掉了,但这让我们很头疼,因为代码正在以这种方式测试可用性。这里的故事不同,但这是我在网络出现“奇怪”情况时首先检查的事情之一。我可以用
1.7.0_80
(8秒后打印
false
)和
1.8.0_101-ea
(立即用相同的代码打印
true
)重现这一点。至少有一个bug修复可能与()有关,但它已被后移植到Java7U45,因此7和8之间的行为应该仍然相同。您在哪个操作系统上运行应用程序?还有,你到底在使用哪个JRE版本?“但是命令行上的ping到达了机器!”。。。让我们回顾一下:1。您的目标计算机(地址192.168.1.200)未运行,并且该地址未被网络中的任何其他设备占用。2.Java7的
isReachable
返回false。3.Java8将返回true。4.命令行上的Ping命令也将返回true。这些语句都正确吗?
但是命令行上的ping到达了机器-但是,必须在该IP上启用一个接口,并且某些操作系统必须具有至少响应ICMP回显请求的IP堆栈。为什么你认为这台机器不应该是可接触的?(上面您说,
…如果该IP地址上没有机器,也可以…
,但显然有一台…)