【问题标题】:Why does Java InetAddress.isReachable() not work on JRE 1.8.x like on JRE 1.7.x为什么 Java InetAddress.isReachable() 不能像在 JRE 1.7.x 上一样在 JRE 1.8.x 上工作
【发布时间】:2016-11-16 23:02:27
【问题描述】:

我在一年前写了一个程序,今天我看到这个程序给了我一些奇怪的输出。我正在使用 InetAddress 类来检测我们网络中的 PC 或笔记本电脑。我的程序按其应有的方式工作,直到 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);

真是奇怪,不知道怎么检测这个错误。

亲切的问候原型

°°°°°编辑

我试过这段代码...在 Java 1.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 到达了机器!

°°°°°EDIT-2

Java 1.8

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

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

Java 1.7

192.168.1.200 - InetAddress false - cmd ping true - 有机器

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

【问题讨论】:

  • 要调试它,您需要使用 Wireshark 等工具观察网络流量。
  • 你试过getByAddress而不是getByName吗?当您尝试在 cmd/bash 上对该地址执行 ping 操作时,您会看到什么?您是否运行了任何防火墙/防病毒软件?我曾经遇到过一个问题,即防病毒软件只是在一台机器的 any 端口上接受 ssh/telnet,而该端口未被采用。你只能建立连接,其余的都死了,但这让我们很头疼,因为代码正在以这种方式测试可用性。这里有不同的故事,但这是我在网络出现“奇怪”问题时首先检查的事情之一。
  • 我可以使用1.7.0_80(8 秒后打印false)和1.8.0_101-ea(立即使用相同的代码打印true)重现此问题。至少有一个可能相关的错误修复 (bugs.java.com/bugdatabase/view_bug.do?bug_id=7163874),但它已被向后移植到 Java 7u45,因此 7 和 8 之间的行为应该仍然相同。您在哪个操作系统上运行应用程序?而且,您使用的是哪个 JRE 版本?
  • "但是命令行上的 ping 到达了机器!" ... 让我们回顾一下: 1. 您的目标计算机(地址 192.168.1.200 )没有运行,并且该地址没有被网络中的任何其他设备占用。 2. Java 7 的 isReachable 返回 false。 3. Java 8 将返回 true。 4. 命令行上的 ping 命令也会返回 true。这些说法都正确吗?
  • But a ping on commandline reaches the machine! - 但是,必须在该 IP 和某些操作系统上启用一个接口,该 IP 堆栈至少响应 ICMP ECHO 请求。为什么你认为这台机器不应该是可达的? (上面你说... also if there is no machine on that IP address ...,但显然有一个....)

标签: java java-8 ip java-7 inetaddress


【解决方案1】:

这看起来像bug #JDK-8159410,显然是在 8u73 之后引入的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    • 2012-12-29
    相关资源
    最近更新 更多