【发布时间】: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