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());
}
}
}
Java多线程扫描局域网中的IP
于 2022-05-03 14:52:16 首次发布