如何使用java(线程)ping snmp设备以获取一系列IP地址?

时间:2010-01-12 10:46:57

标签: java networking

我需要创建一个线程池来使用java语言同时ping一系列ip地址。

请帮帮我。

已编辑1

如果有很多线程被创建,那么我们是否必须显式调用stop()方法来停止线程?还是要小心?

2 个答案:

答案 0 :(得分:2)

这是pingig子任务的implementation。使用引用的有效负载创建线程池和线程不应该太复杂。

修改

如果您可以修改这些设备上的客户端代码,我建议使用自定义协议,而不是使用echo端口 - 类似于心跳,您经常向客户端发送一条小消息(在标准或不同的端口上)和期望在规定的时间内得到答案。

修改2

对于线程基础知识,我真的建议查看Java教程。首先:实现类似public class PingThread extends Thread的类,并将链接中的代码放在run方法的while(true) {...}循环中。使用Thread.sleep()在同一循环中的ping之间添加等待时间。 如果您确实需要ThreadGroup,请覆盖构造函数Thread(ThredGroup group, String name),以便可以在指定的组中创建PingThread。

您可能希望实现一个停止PingThread的开关(几乎每个Java教程都应该介绍),

答案 1 :(得分:0)

默认情况下,Java没有ICMP的实现,因此无法使用标准库从Java ping主机。您的其他选择是查找Java ICMP实现(我不知道是否存在),或者从Java调用系统上的'ping'可执行文件并解析输出。

编辑:Andreas_D的链接表明InetAddress.isReachable()使用ICMP echo请求来ping主机,这就是你如何实现ping。

您可以从该页面获取ReachableTest的代码,并将ReachableTest类更改为Runnable,然后可以在其自己的线程中运行,或者使用java.util.concurrent中的executor服务:

public class ReachableTest implements Runnable {
  private String host;

  public ReachableTest(String host) {
    this.host = host;
  }

  public void run() {
    try {
      InetAddress address = InetAddress.getByName(host);
      System.out.println("Name: " + address.getHostName());
      System.out.println("Addr: " + address.getHostAddress());
      System.out.println("Reach: " + address.isReachable(3000));
    }
    catch (UnknownHostException e) {
      System.err.println("Unable to lookup " + host);
    }
    catch (IOException e) {
      System.err.println("Unable to reach " + host);
    }
  }
}