首先我们需要做的就是确定自己主机的ip地址,然后得出所在的网段,最后就是ping该网段的所有ip地址。
获取本机的ip地址和网段
InetAddress host = InetAddress.getLocalHost();
String ip = host.getHostAddress();
System.out.println("本机的ip : " + ip);
System.out.println("网段是:" + ip.substring(0,ip.lastIndexOf('.')));
得出网段之后我们就可以进行模拟测试可用的IP地址数量
- 利用java程序运行一个windows的exe程序
Process p = Runtime.getRuntime().exec("ping " + "192.168.2.106");
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line = null;
StringBuilder sb = new StringBuilder();
while ((line = br.readLine()) != null) {
if (line.length() != 0)
sb.append(line + "\r\n");
}
System.out.println("本次指令返回的消息是:");
System.out.println(sb.toString());
- 利用多线程(线程池)进行测试的完整代码
package com.chen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
public class ObtainIP {
public static List<String> ableIp = new ArrayList<>(); //存放可用ip
public static void main(String[] args) throws Exception {
//将list转换为线程安全
ableIp = Collections.synchronizedList(ableIp);
//获取本机的ip地址
InetAddress host = InetAddress.getLocalHost();
String ip = host.getHostAddress();
System.out.println("本机的ip : " + ip);
System.out.println("网段是:" + ip.substring(0,ip.lastIndexOf('.')));
//初始化线程池
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(10,20,60,
TimeUnit.SECONDS,new LinkedBlockingQueue<>());
//synchronized关键字可以保证可见性和有序性却无法保证原子性。而AtomicInteger的作用就是为了保证原子性
[AtomicInteger详解](https://baijiahao.baidu.com/s?id=1647621616629561468&wfr=spider&for=pc)
final AtomicInteger number = new AtomicInteger();
Integer i;
for(i = 1;i <= 255; i++){
String IP = ip.substring(0,ip.lastIndexOf('.') + 1) + i; //目的ip地址
//开启线程
threadPool.execute(new Runnable() {
@Override
public void run() {
if(CheckAble(IP))
ableIp.add(IP);
synchronized (number){
System.out.println("已经完成" + number.incrementAndGet() + "个测试");
}
}
});
}
//等待所有线程池中的线程关闭,就关闭线程池
threadPool.shutdown();
//等待线程池关闭,最多等待一小时
if (threadPool.awaitTermination(1, TimeUnit.HOURS)) {
System.out.println("以下ip可用");
for (String s : ableIp){
System.out.println(s);
}
System.out.println("共" + ableIp.size() + "个");
}
}
/**
* 判断目的ip是否能够ping通
* @param ip
* @return
*/
public static boolean CheckAble(String ip){
//判断当前ip是否可以ping通
boolean flag = false;
BufferedReader br = null;
try {
Process process = Runtime.getRuntime().exec("ping " + ip);
InputStreamReader is = new InputStreamReader(process.getInputStream(),"GBK");
br = new BufferedReader(is);
String line = "";
StringBuilder sb = new StringBuilder();
while((line = br.readLine()) != null){
if(line.contains("请求超时")) //出现请求超时的字样就说明这个ip地址是ping不通的
break;
sb.append(line + "/r/n");
}
flag = sb.toString().contains("TTL"); //出现TTL说明是能ping通的
return flag;
} catch (IOException e) {
e.printStackTrace();
return false;
}finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
测试50个的结果