我有一个项目可以ping通LAN网络上的所有计算机。首先我使用InetAddress.isReachable()
但有时函数返回IP无法到达()即使IP可达(尝试在Windows上使用build in function并且IP可以访问)。其次我尝试使用此代码:
Process proc = new ProcessBuilder("ping", host).start();
int exitValue = proc.waitFor();
System.out.println("Exit Value:" + exitValue);
但输出是错误的。 然后我google了一下,找出了这段代码:
import java.io.*;
import java.util.*;
public class JavaPingExampleProgram
{
public static void main(String args[])
throws IOException
{
// create the ping command as a list of strings
JavaPingExampleProgram ping = new JavaPingExampleProgram();
List<String> commands = new ArrayList<String>();
commands.add("ping");
commands.add("-n");
commands.add("1");
commands.add("192.168.1.1");
ping.doCommand(commands);
}
public void doCommand(List<String> command)
throws IOException
{
String s = null;
ProcessBuilder pb = new ProcessBuilder(command);
Process process = pb.start();
BufferedReader stdInput = new BufferedReader(new InputStreamReader(process.getInputStream()));
BufferedReader stdError = new BufferedReader(new InputStreamReader(process.getErrorStream()));
// read the output from the command
System.out.println("Here is the standard output of the command:\n");
while ((s = stdInput.readLine()) != null)
{
System.out.println(s);
}
// read any errors from the attempted command
System.out.println("Here is the standard error of the command (if any):\n");
while ((s = stdError.readLine()) != null)
{
System.out.println(s);
}
}
}
此代码工作正常,但问题是当Windows在其他语言上时,您无法判断地址是否可访问。你们能和我分享一个安全的方法,如何在局域网或VPN网络上ping IP地址。谢谢。
答案 0 :(得分:1)
isReachable()将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接。 因此,如果您的客户端没有执行ICMP ECHO REQUEST的权限,则您的问题可能是客户端计算机上没有足够权限或服务器上的端口7问题的配置问题。可能在你的情况下,你需要解决一方或另一方才能使其发挥作用。
我在OSX和Linux客户端上测试了以下内容,它在测试其他OSX,Linux和Windows Server计算机的可访问性时有效。我没有Windows机器作为客户端运行它。
import java.io.IOException;
import java.net.InetAddress;
public class IsReachable
{
public static void main(final String[] args) throws IOException
{
final InetAddress host = InetAddress.getByName(args[0]);
System.out.println("host.isReachable(1000) = " + host.isReachable(1000));
}
}