接到一个需求,要写个简单的工具,测试本机的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窗口
五、最终的工具的结构: