【发布时间】:2013-06-03 01:24:18
【问题描述】:
我正在尝试 ping 从 192.168.1.1 到 192.168.1.254 的 IP 地址。首先,我使用的是 InetAddress 类,但它被窃听了,一些 IP 即使在,也无法访问。之后我尝试了这种方法,它对于单个 ping IP 非常有效,但是当我将它放在 for-loop 中时,所有 ping 的 IP 都可以访问......你们能告诉我这里有什么问题吗?
代码:
public class Main {
public static void main(String[] args) {
String ip="192.168.1.";
try
{
for(int i=0;i<=254;i++){
String ip2=ip+i;
boolean reachable = (java.lang.Runtime.getRuntime().exec("ping -n 1 "+ip2).waitFor()==0);
if(reachable){
System.out.println("IP is reachable:: "+ip2);
}
else{
System.out.println("IP is not reachable: "+ip2);
}
}
}catch(Exception e)
{
e.printStackTrace();
}
}
}
编辑 1:
我使用内置的 Java 函数来执行 ping,但它不起作用(再次)
这是我使用的代码
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
public class Test {
public static void main(String[] args) throws UnknownHostException, IOException {
String ip = "192.168.1.243";
InetAddress inet = InetAddress.getByName(ip);
System.out.println("Sending Ping Request to " + ip);
if (inet.isReachable(5000)){
System.out.println(ip+" is reachable");
}
else{
System.out.println(ip+" is not reachable");
}
}
}
输出是:
Sending Ping Request to 192.168.1.243
192.168.1.243 is not reachable
这也是我从 Windows 7 内置 Ping 功能 (cmd) 执行 ping 时的 ping 结果
【问题讨论】:
-
你正在检查
waitFor()==0。这意味着您只有在它立即返回时才认为它是可访问的(对于立即返回的某些值)。如果它在 0.245 秒内返回怎么办?换句话说,您想检查 ping 返回的内容,而不是它是否返回。我应该注意到,使用 Java 调用 ping 是一个糟糕的主意 -
.waitFor 返回进程的退出状态,是不是ping命令本身ping成功与否总是返回0? docs.oracle.com/javase/1.5.0/docs/api/java/lang/…
-
@Chris 调用 .waitFor 将导致当前线程在必要时阻塞,等待进程结束,如文档中所述“导致当前线程等待,如有必要,直到进程表示此 Process 对象已终止。”
-
因为这是我的学校项目,我需要用 Java 编写代码。我知道在 Java 中 ping 是个坏主意,但我没有其他选择......
-
@SimonAndréForsberg 对。我想我误解了 waitFor 的输出。根据作者在 Windows 上使用 ping 的命令行参数,正如您所指出的,它始终返回 0。
标签: java for-loop ping runtime.exec