700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用iperf工具 用java的swing 编写网络带宽监测小工具

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

时间:2022-10-30 07:14:08

相关推荐

使用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 offjava -jar xxx.jar

4.PropertiesFileUtil代码

package monitor.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 monitor.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 = "";//服务器ipprivate 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/secif(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 monitor.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);//当前cpuJLabel 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 offset path=.\jdk1.8\binjava -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窗口

五、最终的工具的结构:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。