@liruiyi962464
2024-09-22T18:20:14.000000Z
字数 4458
阅读 77
代码
public void monitorUseState() {
List<ZcMonitor> zcMonitorList = zcMonitorService.list();
Integer flag = 0;
if(zcMonitorList.size() > 0 && zcMonitorList != null) {
for (int i = 0; i < zcMonitorList.size(); i++) {
String ip = zcMonitorList.get(i).getIp();
String name = zcMonitorList.get(i).getName();
String position = zcMonitorList.get(i).getPosition();
// 当返回值是true时,说明监控IP是可用的,false则不可。
int timeOut = 3000; // 超时应该在3钞以上
boolean status = false;
try {
// status = InetAddress.getByName(ip).isReachable(timeOut);
InetAddress address = InetAddress.getByName(ip);
System.out.println("开始检查 IP 地址 " + ip + " 是否可达...");
long startTime = System.currentTimeMillis();
status = address.isReachable(timeOut);
long endTime = System.currentTimeMillis();
System.out.println("检查完成,耗时:" + (endTime - startTime) + " 毫秒");
if (status) {
System.out .println("IP 地址 " + ip + " 是可达的");
} else {
System.out.println("IP 地址 " + ip + " 不可达");
}
} catch (IOException e) {
e.printStackTrace();
}
//System.err.println("监控ip"+ip+"状态"+status);
//onlineOrNot lineOrNot = new onlineOrNot();
//String userAndPwd = onlineOrNot.userAndPwd(ip, username, password);
if (!status) {
// 状态更新到数据库
zcMonitorList.get(i).setUseState("1");
zcMonitorService.updateById(zcMonitorList.get(i));
// 离线(在线状态不用推送)
System.err.println("监控IP:【"+ip+"】监控名称:【"+name+"】监控位置:【"+position+"】【已离线】");
zcWarningInformationService.warnXiaoxi(3,"监控IP:【"+ip+"】监控名称:【"+name+"】监控位置:【"+position+"】【已离线】",zcMonitorList.get(i));
}else {
// 状态更新到数据库
zcMonitorList.get(i).setUseState("2");
zcMonitorService.updateById(zcMonitorList.get(i));
}
}
}
}
public Result<?> pingDevice(@RequestParam(name="ip") String ip) throws Exception {
List<String> pingContent = new ArrayList<>();
boolean b = Ping.ping(ip);
if (b){
pingContent = Ping.pingA(ip);
} else {
String message = "目标主机"+ip+"无法访问,请检查!";
pingContent.add(message);
}
return Result.OK(pingContent);
}
package org.jeecg.modules.demo.ping;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Ping {
public static boolean ping(String ipAddress) throws Exception {
int timeOut = 3000 ; // 超时应该在3钞以上
boolean status = InetAddress.getByName(ipAddress).isReachable(timeOut); // 当返回值是true时,说明host是可用的,false则不可。
return status;
}
public static List<String> ping02(String ipAddress) throws Exception {
List<String> outputLines = new ArrayList<>(); // 用于保存输出的集合
try {
Process pro = Runtime.getRuntime().exec("ping " + ipAddress);
BufferedReader buf = new BufferedReader( new InputStreamReader(
pro.getInputStream(),"GBK"));
int i =1;
String line = null;
while ((line = buf.readLine()) != null)
System.out.println(line);
outputLines.add(line);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
return outputLines;
}
public static boolean ping(String ipAddress, int pingTimes, int timeOut) {
BufferedReader in = null;
Runtime r = Runtime.getRuntime(); // 将要执行的ping命令,此命令是windows格式的命令
String pingCommand = "ping " + ipAddress + " -n " + pingTimes + " -w " + timeOut;
try { // 执行命令并获取输出
System.out.println(pingCommand);
Process p = r.exec(pingCommand);
if (p == null) {
return false;
}
in = new BufferedReader( new InputStreamReader(p.getInputStream())); // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
int connectedCount = 0;
String line = null;
while ((line = in.readLine()) != null) {
connectedCount += getCheckResult(line);
} // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
return connectedCount == pingTimes;
} catch (Exception ex) {
ex.printStackTrace(); // 出现异常则返回假
return false;
} finally {
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
private static int getCheckResult(String line) { // System.out.println("控制台输出的结果为:"+line);
Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(line);
while (matcher.find()) {
return 1;
}
return 0;
}
public static List<String> pingA(String ipAddress){
List<String> outputLines = new ArrayList<>(); // 用于保存输出的集合
try {
// 创建一个Process实例执行ping命令
Process process = Runtime.getRuntime().exec("ping " + ipAddress);
// 读取ping命令的输出
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
String line;
while ((line = reader.readLine()) != null) {
outputLines.add(line); // 将每行输出添加到集合中
}
// 等待ping命令执行完成
int exitCode = process.waitFor();
System.out.println("Ping命令执行完成,退出码: " + exitCode);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return outputLines;
}
public static void main(String[] args) throws Exception {
String ipAddress = "192.168.10.92";
// System.out.println(ping(ipAddress));
// List<String> strings = pingA(ipAddress);
// for (String string : strings) {
// System.out.println(string);
// }
// System.out.println(strings);
System.out.println(ping02(ipAddress));
}
}