使用iperf工具,用java的swing,编写网络带宽监测小工具

接到一个需求,要写个简单的工具,测试本机的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文件内容如下:

@echo off
java -jar xxx.jar

   4.PropertiesFileUtil代码

package com.net.netmonitor.util;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

public class PropertiesFileUtil {

	public static String getValueByKey(String key, String filePath) {
		Properties pps = new Properties();
		try {
			InputStream in = new BufferedInputStream (new FileInputStream(filePath));
			pps.load(in);
			String value = pps.getProperty(key);
			return value;

		}catch (IOException e) {
			e.printStackTrace();
			return null;
		}
	}
}

    5.IperfUtil代码

package com.net.netmonitor.util;

import org.springframework.util.ResourceUtils;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;

//使用iperf工具,调用dmc命令,来检测客户端与服务器段的网速
public class IperfUtil {

    private static String netSec="";//最终返回的结果
    private static String ip = "";//服务器ip
    private static String port = "";//服务器端监听的端口

    public static String getNetSpeed() throws Exception{
        File path = new File(ResourceUtils.getURL("classpath:").getPath());
        if(!path.exists()) path = new File("");

        //当前项目jar包所在目录
        String ROOT = path.getAbsolutePath();
        System.out.println("jar_path>>>"+ROOT);

        //从配置文件获取ip和port的值
        String filePath = ROOT + "\\serverInfo.properties";
        System.out.println("file_path>>>"+filePath);
        ip = PropertiesFileUtil.getValueByKey("ip",filePath);
        port = PropertiesFileUtil.getValueByKey("port",filePath);

        //构造出要执行的命令,检测10s,间隔2s,以MB作为单位
        String cmd =  ROOT + "\\jperf-2.0.0\\bin\\iperf -c "+ip+" -p "+port+" -i 2 -t 10 -f M";
        System.out.println("iperf_path>>>"+cmd);

        Process p = Runtime.getRuntime().exec(cmd);

        InputStream inputStream = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
        String line;
        int count = 0;//带宽总量
        int second = 0;//查询带宽次数
        while((line = reader.readLine())!= null){
            //[312]  0.0-10.0 sec  2.46 GBytes  2.11 Gbits/sec
            if(line.contains("/sec")){//获取到宽带信息,从“Bytes”开始截取,到“/sec”结束
                netSec = line.substring(line.indexOf("Bytes")+5,line.indexOf("MBytes/sec")).trim();
                count +=Integer.parseInt(netSec);
                second ++;

                System.out.println(line);
            }
        }

        //求平均数
        netSec = String.valueOf(count/second);
        System.out.println("平均网速:"+netSec);

        p.waitFor();
        inputStream.close();
        reader.close();
        p.destroy();
        return netSec;
    }
}

    6.FrameUI代码

package com.net.netmonitor.util;

import javax.swing.*;
import java.awt.*;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FrameUI extends JPanel {
    private static final int JFRAME_WIDTH = 350;
    private static final int JFRAME_HEIGHT= 400;
    private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public  void createWindow() throws Exception{

            //窗口-顶层面板
            JFrame jFrame = new JFrame("网速监测");
            jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

            //网格布局,容器中的方法
            GridBagLayout gridBagLayout = new GridBagLayout();
            setLayout(gridBagLayout);
            jFrame.add(this,BorderLayout.CENTER);
            jFrame.setSize(JFRAME_WIDTH,JFRAME_HEIGHT);

            //弹框位置:居中
            Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
            jFrame.setLocation((int)(dimension.getWidth() - JFRAME_WIDTH ) / 2,(int)(dimension.getHeight() - JFRAME_HEIGHT ) / 2);

            //初次打开面板,初始化信息时显示提示消息
            JLabel tipLabel = new JLabel("正在获取本机CPU等信息,请稍等...");
            add(tipLabel);

            //展示面板,并且不可编辑
            jFrame.setVisible(true);
            jFrame.setResizable(false);

            while (true){
                //当前网速
                JLabel lable_net_key = new JLabel("当前带宽:");
                String net_val = IperfUtil.getNetSpeed() + "MB/s";
                JLabel lable_net_val = new JLabel(net_val);

                //当前cpu
                JLabel lable_cpu_key = new JLabel("CPU:");
                String cpu_val = Double.toString(ComputerMonitorUtil.getCpuUsage()) + "%";
                JLabel lable_cpu_val = new JLabel(cpu_val);

                //当前内存
                JLabel lable_mem_key = new JLabel("内存:");
                String mem_val = Double.toString(ComputerMonitorUtil.getMemUsage()) + "%";
                JLabel lable_mem_val = new JLabel(mem_val);

                //当前磁盘
//                JLabel lable_disk_key = new JLabel("磁盘:");
//                String disk_val = Double.toString(ComputerMonitorUtil.getDiskUsage()) + "%";
//                JLabel lable_disk_val = new JLabel(disk_val);

                //当前时间
                JLabel lable_time_key = new JLabel("获取时间:");
                String time_val = sdf.format(new Date());
                JLabel lable_time_val = new JLabel(time_val);


                System.out.println(cpu_val);
                System.out.println(mem_val);
//                System.out.println(disk_val);

                //移除所有组件,重新加载
                removeAll();

                //网格布局
                GridBagConstraints gridBagConstraints = new GridBagConstraints();
                gridBagConstraints.fill = GridBagConstraints.NONE;
                gridBagConstraints.anchor = GridBagConstraints.CENTER;
                gridBagConstraints.weightx = 3;
                gridBagConstraints.weighty = 4;
                //添加组件并指定组件的位置
                addComponent(lable_net_key,gridBagConstraints,0,1,1,1);
                addComponent(lable_net_val,gridBagConstraints,1,1,1,1);
                addComponent(lable_cpu_key,gridBagConstraints,0,2,1,1);
                addComponent(lable_cpu_val,gridBagConstraints,1,2,1,1);
                addComponent(lable_mem_key,gridBagConstraints,0,3,1,1);
                addComponent(lable_mem_val,gridBagConstraints,1,3,1,1);
//                addComponent(lable_disk_key,gridBagConstraints,0,4,1,1);
//                addComponent(lable_disk_val,gridBagConstraints,1,4,1,1);
                addComponent(lable_time_key,gridBagConstraints,0,4,1,1);
                addComponent(lable_time_val,gridBagConstraints,1,4,1,1);

                jFrame.validate();
                jFrame.repaint();
            }

        }

    private void addComponent(Component component,GridBagConstraints gridBagConstraints,int x,int y,int w,int h){
        gridBagConstraints.gridx = x;
        gridBagConstraints.gridy = y;
        gridBagConstraints.gridwidth = w;
        gridBagConstraints.gridheight = h;
        //Container中的方法
        add(component,gridBagConstraints);
    }
}

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

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

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

	@echo off
	set path=.\jdk1.8\bin
	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窗口

五、最终的工具的结构:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值