java获取ip段内所有的ip地址并迭代检查是否能ping通

最近遇到一个需求,需要根据手动输入的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;
    }

}

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值