Java多线程扫描局域网中的IP

package cn.ghostcloud.clusterservice.utils;

import cn.ghostcloud.clusterservice.common.PageListUtils;
import cn.ghostcloud.clusterservice.common.PageResult;
import cn.ghostcloud.clusterservice.vo.IpScanningVo;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.*;

/**
 * @author LWG
 * @data 2022/4/13
 * 根据IP扫描局域网的网段IP工具类
 */
@Slf4j
@Component
public class IpScanning {

    private List<IpScanningVo> ipScanningVos = new ArrayList<>();

    /**
     * 线程数
     */

    int corePoolSize = 50;

    /**
     * 最大线程数
     */
    int maximumPoolSize = 60;

    private ThreadPoolExecutor threadPool =
            new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 3,
            TimeUnit.NANOSECONDS, new LinkedBlockingQueue<>(10),
            new ThreadPoolExecutor.CallerRunsPolicy());

    /**
     * 通过IP扫描对应网段中可以使用的网段
     * @param ips 输入的IP
     */
    public List<IpScanningVo> search(String ips) {
        //清空缓存
        ipScanningVos.clear();
        int divisionIp = ips.lastIndexOf(".");
        String substring = ips.substring(0, divisionIp + 1);
        //扫描对应网段中的所有Ip
        BlockingQueue<IpScanningVo> queue = new ArrayBlockingQueue<>(255);
        for (int i = 1; i < 255; i++) {
            String iip = substring + i;
            threadPool.submit(new PingIp(iip, queue));
        }
        threadPool.shutdown();
        //判断当前线程是否全部执行完成,防止没有执行完返回结果
        while (!threadPool.isTerminated()){}
        ipScanningVos = new ArrayList<>(queue);
        return ipScanningVos;
    }

    /**
     * 缓存分页
     * @param sshUser 封装类
     */
    public PageListUtils<IpScanningVo> searchByPages(SSHUser sshUser) {
        if (ipScanningVos.isEmpty()) {
            search(sshUser.getIp());
        }
        return new PageListUtils<>(ipScanningVos, sshUser.getCurrent(), sshUser.getPageSize());
    }

    private static class PingIp implements Runnable {
        private String ip;
        private Queue<IpScanningVo> array;

        public PingIp(String ip, Queue<IpScanningVo> array) {
            this.array = array;
            this.ip = ip;
        }

        @Override
        public void run() {
            //遍历IP地址
            InetAddress addip = null;
            try {
                addip = InetAddress.getByName(ip);
            } catch (UnknownHostException e) {
                e.printStackTrace();
            }
            //检查设备是否在线,其中1000ms指定的是超时时间
            // 当返回值是true时,说明host是可用的,false则不可。
            boolean status = false;
            try {
                if (addip != null) {
                    status = addip.isReachable(1000);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (status) {
                IpScanningVo ipScanning = new IpScanningVo(addip.getHostName(), ip);
                log.info("IP地址为:" + ip + "\t\t设备名称为: " + addip.getHostName() + "\t\t是否可用: " + (status ? "可用" : "不可用"));
                array.add(ipScanning);
            }
        }
    }

    public static void main(String[] args) {
        List<IpScanningVo> search = new IpScanning().search("192.168.0.6");
        for (IpScanningVo ipScanningVo : search) {
            System.out.println(ipScanningVo.getIp() + ":::" + ipScanningVo.getName());
        }
    }
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值