安全的Java Pinging

时间:2013-06-07 10:39:11

标签: java ping processbuilder inetaddress

我有一个项目可以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地址。谢谢。

1 个答案:

答案 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));
    }
}