我想将IP地址从192.168.1.1 ping到192.168.1.254。首先,我使用的是InetAddress类,但是它被窃听,并且一些IP即使它们也无法访问。之后我尝试了这种方法,它对单个ping IP工作得非常好,但是当我把它放在for循环中时所有可达的IP都可以到达......你能告诉我这里有什么问题吗?
CODE:
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
当我从内置Ping函数(cmd)
的Windows 7执行ping操作时,此处也是ping结果
答案 0 :(得分:3)
改为使用isReachable()
。
InetAddress.getByName(address).isReachable(timeout);
答案 1 :(得分:1)
为什么不起作用
您正在使用ping进程的退出状态,而不是ping本身的实际结果。它只会告诉您进程是否正常退出。 ping失败不会导致进程异常退出,因此总是返回退出代码0(零)。
您可以尝试的方式:
获取进程的输出流,它将告诉您输出的内容。然后尝试解释/解析这个,但是你希望:
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Process.html#getOutputStream%28%29
(虽然这对我来说也不是很完美,但它比使用退出代码更好)
答案 2 :(得分:0)
亲爱的先生,你编程的问题不能通过循环ping系统的问题是,与系统的回复相比,循环的执行速度更快。这就是为什么他们中的一些回复无法访问,为了解决这个问题你是应该使用一个线程并通过使用Thread.sleep()方法在每次ping上引入一点延迟。我认为这会起作用谢谢