当前位置:   article > 正文

使用iperf工具,用java的swing,编写网络带宽监测小工具_java 如何实现类似 宝塔面板的网络带宽监控

java 如何实现类似 宝塔面板的网络带宽监控

接到一个需求,要写个简单的工具,测试本机的CPU、内存等信息,以及监测当前主机与连接的服务器之间的网速信息
获取CPU和内存的方法,此处省略,重点是监测网速这一块

先看下工具的目录结构:

jperf是需要用到测试网络带宽的工具包,jar包是需要运行的项目,run.bat是项目的启动文件,serverInfo文件是用来配置服务器IP和端口的

再看下效果图:

一、获取网络信息,需要利用iperf工具
    简要说明下iperf工具的使用
    1.下载工具包,有Linux和window版本
    2.在Linux中(作为服务端),解压tar包,编译并安装,使用如下命令运行:(详细命令网上搜)
        iperf -s
    此时服务端会开启5001端口
    3.在window系统中(作为服务端),解压压缩包,打开cmd命令,进入压缩包的bin目录,并执行以下命令:
        iperf -c 192.168.1.24 -p 5001 -i 5 -t 5
    回车即可看到结果

二、回到我们的任务,整体的思路和步骤:
    1.找个Linux服务器,安装iperf,并启动服务
    2.创建一个springboot项目,为了方便打包
    3.写一个工具类PropertiesFileUtil,用来读取properties配置文件的值
    4.写一个工具类IperfUtil,用来执行命令,从而获取检测到的网速的结果
    5.写一个工具类ComputerMonitorUtil,用来获取CPU、磁盘等信息
    6.写一个工具类FrameUI,用来构造窗口界面,并展示信息,信息从3、4的工具类中获取
    7.测试完成后,使用maven打包,xxx.jar
    8.编写一个bat文件,用来启动jar包文件
    9.最后创建一个文件夹,将xxx.jar、window版本的iperf文件夹、run.bat文件和serverInfo.peoperties文件放在同一个文件夹下
    10.点击run.bat文件,可以打开窗口界面,并显示相应信息

三、细节部分
    1.需要注意的就是,在用java执行命令的时候,需要获取正确的项目所在目录,否则会报错,找不到要执行的文件
    2.打包完成后,一定要把iperf文件夹放到相应的位置,具体位置和1中的命令所指向的目录有关
    3.run.bat文件内容如下:

  1. @echo off
  2. java -jar xxx.jar

   4.PropertiesFileUtil代码

  1. package com.net.netmonitor.util;
  2. import java.io.BufferedInputStream;
  3. import java.io.FileInputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.util.Properties;
  7. public class PropertiesFileUtil {
  8. public static String getValueByKey(String key, String filePath) {
  9. Properties pps = new Properties();
  10. try {
  11. InputStream in = new BufferedInputStream (new FileInputStream(filePath));
  12. pps.load(in);
  13. String value = pps.getProperty(key);
  14. return value;
  15. }catch (IOException e) {
  16. e.printStackTrace();
  17. return null;
  18. }
  19. }
  20. }

    5.IperfUtil代码

  1. package com.net.netmonitor.util;
  2. import org.springframework.util.ResourceUtils;
  3. import java.io.BufferedReader;
  4. import java.io.File;
  5. import java.io.InputStream;
  6. import java.io.InputStreamReader;
  7. //使用iperf工具,调用dmc命令,来检测客户端与服务器段的网速
  8. public class IperfUtil {
  9. private static String netSec="";//最终返回的结果
  10. private static String ip = "";//服务器ip
  11. private static String port = "";//服务器端监听的端口
  12. public static String getNetSpeed() throws Exception{
  13. File path = new File(ResourceUtils.getURL("classpath:").getPath());
  14. if(!path.exists()) path = new File("");
  15. //当前项目jar包所在目录
  16. String ROOT = path.getAbsolutePath();
  17. System.out.println("jar_path>>>"+ROOT);
  18. //从配置文件获取ip和port的值
  19. String filePath = ROOT + "\\serverInfo.properties";
  20. System.out.println("file_path>>>"+filePath);
  21. ip = PropertiesFileUtil.getValueByKey("ip",filePath);
  22. port = PropertiesFileUtil.getValueByKey("port",filePath);
  23. //构造出要执行的命令,检测10s,间隔2s,以MB作为单位
  24. String cmd = ROOT + "\\jperf-2.0.0\\bin\\iperf -c "+ip+" -p "+port+" -i 2 -t 10 -f M";
  25. System.out.println("iperf_path>>>"+cmd);
  26. Process p = Runtime.getRuntime().exec(cmd);
  27. InputStream inputStream = p.getInputStream();
  28. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  29. String line;
  30. int count = 0;//带宽总量
  31. int second = 0;//查询带宽次数
  32. while((line = reader.readLine())!= null){
  33. //[312] 0.0-10.0 sec 2.46 GBytes 2.11 Gbits/sec
  34. if(line.contains("/sec")){//获取到宽带信息,从“Bytes”开始截取,到“/sec”结束
  35. netSec = line.substring(line.indexOf("Bytes")+5,line.indexOf("MBytes/sec")).trim();
  36. count +=Integer.parseInt(netSec);
  37. second ++;
  38. System.out.println(line);
  39. }
  40. }
  41. //求平均数
  42. netSec = String.valueOf(count/second);
  43. System.out.println("平均网速:"+netSec);
  44. p.waitFor();
  45. inputStream.close();
  46. reader.close();
  47. p.destroy();
  48. return netSec;
  49. }
  50. }

    6.FrameUI代码

  1. package com.net.netmonitor.util;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.text.SimpleDateFormat;
  5. import java.util.Date;
  6. public class FrameUI extends JPanel {
  7. private static final int JFRAME_WIDTH = 350;
  8. private static final int JFRAME_HEIGHT= 400;
  9. private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  10. public void createWindow() throws Exception{
  11. //窗口-顶层面板
  12. JFrame jFrame = new JFrame("网速监测");
  13. jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  14. //网格布局,容器中的方法
  15. GridBagLayout gridBagLayout = new GridBagLayout();
  16. setLayout(gridBagLayout);
  17. jFrame.add(this,BorderLayout.CENTER);
  18. jFrame.setSize(JFRAME_WIDTH,JFRAME_HEIGHT);
  19. //弹框位置:居中
  20. Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
  21. jFrame.setLocation((int)(dimension.getWidth() - JFRAME_WIDTH ) / 2,(int)(dimension.getHeight() - JFRAME_HEIGHT ) / 2);
  22. //初次打开面板,初始化信息时显示提示消息
  23. JLabel tipLabel = new JLabel("正在获取本机CPU等信息,请稍等...");
  24. add(tipLabel);
  25. //展示面板,并且不可编辑
  26. jFrame.setVisible(true);
  27. jFrame.setResizable(false);
  28. while (true){
  29. //当前网速
  30. JLabel lable_net_key = new JLabel("当前带宽:");
  31. String net_val = IperfUtil.getNetSpeed() + "MB/s";
  32. JLabel lable_net_val = new JLabel(net_val);
  33. //当前cpu
  34. JLabel lable_cpu_key = new JLabel("CPU:");
  35. String cpu_val = Double.toString(ComputerMonitorUtil.getCpuUsage()) + "%";
  36. JLabel lable_cpu_val = new JLabel(cpu_val);
  37. //当前内存
  38. JLabel lable_mem_key = new JLabel("内存:");
  39. String mem_val = Double.toString(ComputerMonitorUtil.getMemUsage()) + "%";
  40. JLabel lable_mem_val = new JLabel(mem_val);
  41. //当前磁盘
  42. // JLabel lable_disk_key = new JLabel("磁盘:");
  43. // String disk_val = Double.toString(ComputerMonitorUtil.getDiskUsage()) + "%";
  44. // JLabel lable_disk_val = new JLabel(disk_val);
  45. //当前时间
  46. JLabel lable_time_key = new JLabel("获取时间:");
  47. String time_val = sdf.format(new Date());
  48. JLabel lable_time_val = new JLabel(time_val);
  49. System.out.println(cpu_val);
  50. System.out.println(mem_val);
  51. // System.out.println(disk_val);
  52. //移除所有组件,重新加载
  53. removeAll();
  54. //网格布局
  55. GridBagConstraints gridBagConstraints = new GridBagConstraints();
  56. gridBagConstraints.fill = GridBagConstraints.NONE;
  57. gridBagConstraints.anchor = GridBagConstraints.CENTER;
  58. gridBagConstraints.weightx = 3;
  59. gridBagConstraints.weighty = 4;
  60. //添加组件并指定组件的位置
  61. addComponent(lable_net_key,gridBagConstraints,0,1,1,1);
  62. addComponent(lable_net_val,gridBagConstraints,1,1,1,1);
  63. addComponent(lable_cpu_key,gridBagConstraints,0,2,1,1);
  64. addComponent(lable_cpu_val,gridBagConstraints,1,2,1,1);
  65. addComponent(lable_mem_key,gridBagConstraints,0,3,1,1);
  66. addComponent(lable_mem_val,gridBagConstraints,1,3,1,1);
  67. // addComponent(lable_disk_key,gridBagConstraints,0,4,1,1);
  68. // addComponent(lable_disk_val,gridBagConstraints,1,4,1,1);
  69. addComponent(lable_time_key,gridBagConstraints,0,4,1,1);
  70. addComponent(lable_time_val,gridBagConstraints,1,4,1,1);
  71. jFrame.validate();
  72. jFrame.repaint();
  73. }
  74. }
  75. private void addComponent(Component component,GridBagConstraints gridBagConstraints,int x,int y,int w,int h){
  76. gridBagConstraints.gridx = x;
  77. gridBagConstraints.gridy = y;
  78. gridBagConstraints.gridwidth = w;
  79. gridBagConstraints.gridheight = h;
  80. //Container中的方法
  81. add(component,gridBagConstraints);
  82. }
  83. }

四、完善功能,使体验更加友好

以上已经可以实现需求,现在在以上现有的功能,完善一下

   1.集成jdk环境,不需要在机器上额外配置jdk环境变量
        1)下载绿色版jdk,解压到run.bat同一级目录
        2)修改run.bat文件,添加path,如下:

  1. @echo off
  2. set path=.\jdk1.8\bin
  3. java -jar netmonitor-0.0.1-SNAPSHOT.jar

    2.直接点击run.bat,启动项目后,会有个cmd弹框,并显示打印的消息,给客户用的时候,体验不好
        1)在与run.bat同一级目录,新建一个run.vbs文件
        2)添加内容如下:

    createobject("wscript.shell").run ".\run.bat",0

       3)此时点击run.vbs,会调用run.bat文件,进而启动java程序,并且不会弹出cmd窗口

五、最终的工具的结构:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/715692
推荐阅读
相关标签
  

闽ICP备14008679号