描500个IP10秒钟左右, 一个IP等待0.3秒
说来惭愧, 我觉得是用java写的过程编程, 少贴一点仅供参考:
1. 利用Ping比较愚蠢, 但是相对简单些
2. 如果Ping 成功后, 用nbtstat还可以得到主机名, 当前用户名, MAC地址...一切尽在掌握中 :)
说来惭愧, 我觉得是用java写的过程编程, 少贴一点仅供参考:
- package steeven;
- import java.sql.*;
- import java.io.*;
- import java.util.*;
- import java.text.*;
- import javax.servlet.http.*;
- public class Ip extends Common implements Runnable{
- public String ip; // IP, 用户名, 主机名
- ResultSet list; // 分页显示的记录集
- public Ip cur; // 分页显示的当前记录
- static public Hashtable ping = new Hashtable(); //ping 后的结果集
- static int threadCount = 0; //当前线程的数量, 防止过多线程摧毁电脑
- public Ip() {}
- public Ip(String ip){
- this.ip=ip;
- Thread r = new Thread(this);
- r.start();
- }
- public static void Ping(String ip) throws Exception{
- //最多30个线程
- while(threadCount>30)
- Thread.sleep(50);
- threadCount +=1;
- Ip p = new Ip(ip);
- }
- public void PingAll() throws Exception{
- threadCount =0;
- ping = new Hashtable();
- while(next()) //next()对所有局域网Ip放到cur
- Ping(cur.ip);
- //等着所有Ping结束
- while(threadCount>0)
- Thread.sleep(50);
- }
- public void run(){
- try{
- Process p= Runtime.getRuntime().exec ("ping "+ip+ " -w 300 -n 1");
- InputStreamReader ir = new InputStreamReader(p.getInputStream());
- LineNumberReader input = new LineNumberReader (ir);
- //读取结果行
- for (int i=1 ; i<7; i++)
- input.readLine();
- String line= input.readLine();
- if (line.length()<17 || line.substring(8,17).equals("timed out"))
- ping.put(ip,new Boolean(false));
- else
- ping.put(ip,new Boolean(true));
- //线程结束
- threadCount -= 1;
- }catch (IOException e){}
- }
- public static void main(String[] args) throws Exception{
- Ip ip= new Ip();
- ip.PingAll();
- java.util.Enumeration key = ping.keys();
- String k;
- while((k = (String)key.nextElement()) != null)
- System.out.println(k+": "+ping.get(k));
- }
- }
2. 如果Ping 成功后, 用nbtstat还可以得到主机名, 当前用户名, MAC地址...一切尽在掌握中 :)