[关闭]
@liruiyi962464 2024-09-22T18:20:14.000000Z 字数 4458 阅读 77

ping

代码


自己写的ping

  1. public void monitorUseState() {
  2. List<ZcMonitor> zcMonitorList = zcMonitorService.list();
  3. Integer flag = 0;
  4. if(zcMonitorList.size() > 0 && zcMonitorList != null) {
  5. for (int i = 0; i < zcMonitorList.size(); i++) {
  6. String ip = zcMonitorList.get(i).getIp();
  7. String name = zcMonitorList.get(i).getName();
  8. String position = zcMonitorList.get(i).getPosition();
  9. // 当返回值是true时,说明监控IP是可用的,false则不可。
  10. int timeOut = 3000; // 超时应该在3钞以上
  11. boolean status = false;
  12. try {
  13. // status = InetAddress.getByName(ip).isReachable(timeOut);
  14. InetAddress address = InetAddress.getByName(ip);
  15. System.out.println("开始检查 IP 地址 " + ip + " 是否可达...");
  16. long startTime = System.currentTimeMillis();
  17. status = address.isReachable(timeOut);
  18. long endTime = System.currentTimeMillis();
  19. System.out.println("检查完成,耗时:" + (endTime - startTime) + " 毫秒");
  20. if (status) {
  21. System.out .println("IP 地址 " + ip + " 是可达的");
  22. } else {
  23. System.out.println("IP 地址 " + ip + " 不可达");
  24. }
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. }
  28. //System.err.println("监控ip"+ip+"状态"+status);
  29. //onlineOrNot lineOrNot = new onlineOrNot();
  30. //String userAndPwd = onlineOrNot.userAndPwd(ip, username, password);
  31. if (!status) {
  32. // 状态更新到数据库
  33. zcMonitorList.get(i).setUseState("1");
  34. zcMonitorService.updateById(zcMonitorList.get(i));
  35. // 离线(在线状态不用推送)
  36. System.err.println("监控IP:【"+ip+"】监控名称:【"+name+"】监控位置:【"+position+"】【已离线】");
  37. zcWarningInformationService.warnXiaoxi(3,"监控IP:【"+ip+"】监控名称:【"+name+"】监控位置:【"+position+"】【已离线】",zcMonitorList.get(i));
  38. }else {
  39. // 状态更新到数据库
  40. zcMonitorList.get(i).setUseState("2");
  41. zcMonitorService.updateById(zcMonitorList.get(i));
  42. }
  43. }
  44. }
  45. }

使用工具类

  1. public Result<?> pingDevice(@RequestParam(name="ip") String ip) throws Exception {
  2. List<String> pingContent = new ArrayList<>();
  3. boolean b = Ping.ping(ip);
  4. if (b){
  5. pingContent = Ping.pingA(ip);
  6. } else {
  7. String message = "目标主机"+ip+"无法访问,请检查!";
  8. pingContent.add(message);
  9. }
  10. return Result.OK(pingContent);
  11. }
  1. package org.jeecg.modules.demo.ping;
  2. import java.io.BufferedReader;
  3. import java.io.IOException;
  4. import java.io.InputStreamReader;
  5. import java.net.InetAddress;
  6. import java.util.ArrayList;
  7. import java.util.List;
  8. import java.util.regex.Matcher;
  9. import java.util.regex.Pattern;
  10. public class Ping {
  11. public static boolean ping(String ipAddress) throws Exception {
  12. int timeOut = 3000 ; // 超时应该在3钞以上
  13. boolean status = InetAddress.getByName(ipAddress).isReachable(timeOut); // 当返回值是true时,说明host是可用的,false则不可。
  14. return status;
  15. }
  16. public static List<String> ping02(String ipAddress) throws Exception {
  17. List<String> outputLines = new ArrayList<>(); // 用于保存输出的集合
  18. try {
  19. Process pro = Runtime.getRuntime().exec("ping " + ipAddress);
  20. BufferedReader buf = new BufferedReader( new InputStreamReader(
  21. pro.getInputStream(),"GBK"));
  22. int i =1;
  23. String line = null;
  24. while ((line = buf.readLine()) != null)
  25. System.out.println(line);
  26. outputLines.add(line);
  27. } catch (Exception ex) {
  28. System.out.println(ex.getMessage());
  29. }
  30. return outputLines;
  31. }
  32. public static boolean ping(String ipAddress, int pingTimes, int timeOut) {
  33. BufferedReader in = null;
  34. Runtime r = Runtime.getRuntime(); // 将要执行的ping命令,此命令是windows格式的命令
  35. String pingCommand = "ping " + ipAddress + " -n " + pingTimes + " -w " + timeOut;
  36. try { // 执行命令并获取输出
  37. System.out.println(pingCommand);
  38. Process p = r.exec(pingCommand);
  39. if (p == null) {
  40. return false;
  41. }
  42. in = new BufferedReader( new InputStreamReader(p.getInputStream())); // 逐行检查输出,计算类似出现=23ms TTL=62字样的次数
  43. int connectedCount = 0;
  44. String line = null;
  45. while ((line = in.readLine()) != null) {
  46. connectedCount += getCheckResult(line);
  47. } // 如果出现类似=23ms TTL=62这样的字样,出现的次数=测试次数则返回真
  48. return connectedCount == pingTimes;
  49. } catch (Exception ex) {
  50. ex.printStackTrace(); // 出现异常则返回假
  51. return false;
  52. } finally {
  53. try {
  54. in.close();
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }
  60. // 若line含有=18ms TTL=16字样,说明已经ping通,返回1,否則返回0.
  61. private static int getCheckResult(String line) { // System.out.println("控制台输出的结果为:"+line);
  62. Pattern pattern = Pattern.compile("(\\d+ms)(\\s+)(TTL=\\d+)", Pattern.CASE_INSENSITIVE);
  63. Matcher matcher = pattern.matcher(line);
  64. while (matcher.find()) {
  65. return 1;
  66. }
  67. return 0;
  68. }
  69. public static List<String> pingA(String ipAddress){
  70. List<String> outputLines = new ArrayList<>(); // 用于保存输出的集合
  71. try {
  72. // 创建一个Process实例执行ping命令
  73. Process process = Runtime.getRuntime().exec("ping " + ipAddress);
  74. // 读取ping命令的输出
  75. BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));
  76. String line;
  77. while ((line = reader.readLine()) != null) {
  78. outputLines.add(line); // 将每行输出添加到集合中
  79. }
  80. // 等待ping命令执行完成
  81. int exitCode = process.waitFor();
  82. System.out.println("Ping命令执行完成,退出码: " + exitCode);
  83. } catch (IOException | InterruptedException e) {
  84. e.printStackTrace();
  85. }
  86. return outputLines;
  87. }
  88. public static void main(String[] args) throws Exception {
  89. String ipAddress = "192.168.10.92";
  90. // System.out.println(ping(ipAddress));
  91. // List<String> strings = pingA(ipAddress);
  92. // for (String string : strings) {
  93. // System.out.println(string);
  94. // }
  95. // System.out.println(strings);
  96. System.out.println(ping02(ipAddress));
  97. }
  98. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注