最近遇到一个需求,需要根据手动输入的ip地址范围,解析出该ip段范围内所有的ip地址,并检查是否能够ping通这些ip地址。
那么这个问题可以拆分为两步:
一:根据ip段计算出所有的ip
我们知道,ip地址本质上是32位的二进制数,我们将其其八位做一次分隔即可得到我们常用的xxx.xx.xxx.xxx的ip地址,那么反过来,我们也可以将xxx.xx.xxx.xxx直接转化为数字,这样的话可以很快的遍历出ip段内所有的ip。
二:ping所有的ip
可以调用untime.getRuntime().exec(ins)方法直接执行ping命令,根据ping命令的返回值判断是否能够ping通
具体代码如下:
package com.test;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class PingTest {
public static void main(String[] args) {
//起始ip
String str_ip_start = "172.18.216.30";
//结束ip
String str_ip_stop = "172.18.217.11";
//将ip转化为long型数字,以便通过for循环遍历所有的ip
long long_ip_start = getIpFromString(str_ip_start);
long long_ip_stop = getIpFromString(str_ip_stop);
System.out.println(getIpFromString(str_ip_start));
System.out.println(getIpFromString(str_ip_stop));
ArrayList<String> ip_list = new ArrayList<String>();
for (long ip = long_ip_start; ip <= long_ip_stop; ip++) {
//将ip还原为xx.xx.xx.xx
String str_ip = getIpFromLong(ip);
boolean isPing = ping(str_ip);
if (isPing) {
ip_list.add(str_ip);
}
}
}
public static boolean ping(String ip) {
// 前缀根据自己需求调整
String ins = "ping " + ip;
try {
Process p = Runtime.getRuntime().exec(ins);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream(), "GBK"));
String line = null;
while ((line = reader.readLine()) != null) {
if (line.indexOf("来自") != -1) { //这里不同的cmd可能不一样
System.out.println(ip + " 连接成功");
return true;
}
if (line.indexOf("请求超时") != -1) { //这里也是
System.out.println(ip + " 连接失败");
return false;
}
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
/**
* 把long类型的Ip转为一般Ip类型:xx.xx.xx.xx
*
* @param ip
* @return
*/
public static String getIpFromLong(Long ip) {
String s1 = String.valueOf((ip & 4278190080L) / 16777216L);
String s2 = String.valueOf((ip & 16711680L) / 65536L);
String s3 = String.valueOf((ip & 65280L) / 256L);
String s4 = String.valueOf(ip & 255L);
return s1 + "." + s2 + "." + s3 + "." + s4;
}
/**
* 把xx.xx.xx.xx类型的转为long类型的
*
* @param ip
* @return
*/
public static Long getIpFromString(String ip) {
Long ipLong = 0L;
String ipTemp = ip;
ipLong = ipLong * 256
+ Long.parseLong(ipTemp.substring(0, ipTemp.indexOf(".")));
ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
ipLong = ipLong * 256
+ Long.parseLong(ipTemp.substring(0, ipTemp.indexOf(".")));
ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
ipLong = ipLong * 256
+ Long.parseLong(ipTemp.substring(0, ipTemp.indexOf(".")));
ipTemp = ipTemp.substring(ipTemp.indexOf(".") + 1, ipTemp.length());
ipLong = ipLong * 256 + Long.parseLong(ipTemp);
return ipLong;
}
}