记一次oshi类库的使用(Java通过调用实现系统流量监控),附常用Api

文章目录

  • oshi简单使用及常用Api
    • 支持的功能
    • 官方文档及API地址
    • 项目案例
  • 如有问题 欢迎指正 共同进步嘛~

oshi简单使用及常用Api

OSHI 是一个免费的基于 JNA(本机)的 Java 操作系统和硬件信息库。它不需要安装任何额外的本机库,旨在提供跨平台实现来检索系统信息,例如操作系统版本、进程、内存和 CPU 使用情况、磁盘和分区、设备、传感器等。
支持的平台:MacOS、Linux、Windows、Android、Unix等

支持的功能

可以直接通过Api获取系统级别的一些参数及数据。
1.计算机系统和固件、基板
2.操作系统和版本/构建
3.物理(核心)和逻辑(超线程)CPU、处理器组、NUMA 节点
4.系统和每个处理器负载、使用滴答计数器、中断、正常运行时间
5.进程正常运行时间、CPU、内存使用情况、用户/组、命令行参数、线程详细信息
6.使用/可用的物理和虚拟内存
7.已安装的文件系统(类型、可用空间和总空间、选项、读取和写入)
8.磁盘驱动器(型号、序列号、大小、读取和写入)和分区
9.网络接口(IP、带宽输入/输出)、网络参数、TCP/UDP 统计信息
10.电池状态(容量百分比、剩余时间、电量使用统计数据)
11.USB设备
12.连接的显示器(带有 EDID 信息)、显卡和音频卡
13.某些硬件上的传感器(温度、风扇速度、电压)

官方文档及API地址

官网:点击跳转
API:点击跳转

项目案例

前段时间做了一个类似监控网络流量的项目。需求有抓包、实时速率监控、流量总量监控等。
场景是一台主服务器部署程序需要监控受控的两台服务器的一些数据如流量数据等。那会也算是Demo项目没进行调研,怎么简单怎么来,怎么方便怎么来。我大致说下那会的流程(别嫌弃菜),主程序通过配置文件配置的受控服务器地址、ip。通过ssh远程到受控端通过执行命令获取的网卡走的流量根据间隔时间推算实时速率再通过MQ发送到前端进行实时展示。获取流量的示例代码如下

    /**
     * 获取网卡接收流量信息
     * 参数1【网卡名称】
     */
    public static final String RX = "cat /proc/net/dev | grep {网卡名称} | sed 's/:/ /g'|awk '{print $2}'";

    /**
     * 获取网卡发送流量信息
     * 参数1【网卡名称】
     */
    public static final String TX = "cat /proc/net/dev | grep {网卡名称} | sed 's/:/ /g'|awk '{print $10}'";

那会也可以说是临时Demo演示但是也是备受它的煎熬(测试:你这统计不准,我FTP显示速率7.9M,你这才3M等等)
后台发现也确实有问题
1.这个网卡文件是虚拟文件,里面的数据重启网卡会清0
2.需求要求五秒发一次,但是SSH会受网络的波动而影响时间(比如你间隔五秒起一个定时,但是SSH就废了10s,那么就算你读取到了你也计算的是不准的,除非你把整个代码执行的时间+延时间隔做基准计算可能还会差距不是那么大(大坑))
3.不一一描述了,反正问题一堆。

然而已经感觉这个项目不了了之的时候,突然他来了,带着需求走来了。说是正式项目需要把之前的坑,之前的临时方案给替换。所以苦逼程序猿可不就得调研了吗。通过一些途径也了解到一些现成类库等。所以搭了一个Demo试试网上都说好的oshi类型。果然 确实好使!!!也准确!!、
话不多说 直接展示
第一步:你得导入依赖(这应该没什么异议吧,版本号可以去官网找最新的)

<dependency>
    <groupId>com.github.oshi</groupId>
    <artifactId>oshi-core</artifactId>
    <version>6.4.7</version>
</dependency>

第二步:就是我最喜欢的 直接调用Api

    @Test
    public void testOshi(){
        SystemInfo si = new SystemInfo();
        HardwareAbstractionLayer hal = si.getHardware();
        while (true){
            List<NetworkIF> networkIFs = hal.getNetworkIFs();
            for (NetworkIF networkIF : networkIFs) {
                if(networkIF.getDisplayName().contains("Wireless")){//因为很多网卡 我只是取的我无线网卡作为测试
                    if (networkIF.updateAttributes()) {
                        // 等待一段时间
                        networkIF.updateAttributes();
                        long rxBytes = networkIF.getBytesRecv();
                        long txBytes = networkIF.getBytesSent();
                        try {
                            Thread.sleep(1000);//睡会儿
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        networkIF.updateAttributes();
                        long rxBytes1 = networkIF.getBytesRecv();
                        long txBytes1 = networkIF.getBytesSent();
                        long rxSpeed = (rxBytes1 - rxBytes) * 8 / 1024; // 计算接收速率
                        long txSpeed = (txBytes1 - txBytes) * 8 / 1024; // 计算发送速率

                        System.out.println("接口:" + networkIF.getDisplayName());
                        System.out.println("接收速率:" + rxSpeed + " Kb/s");
                        System.out.println("发送速率:" + txSpeed + " Kb/s");
                    }
                }
            }
        }
    }

第三步:这一步看不看无所谓啦,我是测了测它的速率到底准确不准确(对比任务管理器)

第四步:调研就这结束了。但是这个类库确实全而强,感兴趣的可以爬一下官网的API文档,我这里就不展示了

如有问题 欢迎指正 共同进步嘛~

附一个前辈通过Java集成oshi完成的页面,我感觉很不错。


End.
author: 码下无限连.

版权声明:本文为博主作者:码下无限连原创文章,版权归属原作者,如果侵权,请联系我们删除!

原文链接:https://blog.csdn.net/weixin_49013362/article/details/134332416

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2024年4月22日
下一篇 2024年4月22日

相关推荐