java网络编程---测试本网段可用的ip数量

首先我们需要做的就是确定自己主机的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个的结果
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

译制片~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值