记一次oshi类库的使用(Java通过调用实现系统流量监控),附常用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: 码下无限连.

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java动态代理是一种通过在运行时期间生成代理对象来实现对目标对象进行代理的技术。它可以在不修改目标对象的情况下,为目标对象提供额外的功能。 Java动态代理实现的核心是利用了Java的反射机制和动态生成类的技术。在动态代理中,我们需要定义一个代理类和一个实现了InvocationHandler接口的处理器类。 代理类是在运行时动态生成的类,它是目标对象的代理,它实现了与目标对象相同的接口,并且在方法调用时会通过InvocationHandler接口的实现类来处理方法的调用。InvocationHandler接口中只有一个方法invoke(Object proxy, Method method, Object[] args),这个方法就是用来处理方法调用的。 下面是一个简单的Java动态代理的示例代码: ``` import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Object target; public DynamicProxy(Object target) { this.target = target; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before method"); Object result = method.invoke(target, args); System.out.println("after method"); return result; } public static void main(String[] args) { RealObject realObject = new RealObject(); DynamicProxy dynamicProxy = new DynamicProxy(realObject); Interface proxyObject = (Interface) Proxy.newProxyInstance( Interface.class.getClassLoader(), new Class[] { Interface.class }, dynamicProxy); proxyObject.doSomething(); } } interface Interface { void doSomething(); } class RealObject implements Interface { public void doSomething() { System.out.println("RealObject doSomething"); } } ``` 在这个示例中,我们定义了一个DynamicProxy类作为代理处理器,它实现了InvocationHandler接口。在DynamicProxy类中,我们定义了一个Object类型的target属性,它表示目标对象。 在DynamicProxy类的invoke方法中,我们先输出了一句话“before method”,然后通过反射机制调用目标对象的方法,最后输出了一句话“after method”。 在DynamicProxy类的main方法中,我们首先创建了一个RealObject对象作为目标对象,然后创建了一个DynamicProxy对象,并将RealObject对象作为参数传递给DynamicProxy对象的构造方法。接着,我们通过Proxy.newProxyInstance方法动态生成了一个代理对象,并将DynamicProxy对象作为参数传递给它。最后,我们调用代理对象的doSomething方法。 当我们运行这个程序时,它会输出以下内容: ``` before method RealObject doSomething after method ``` 这表明,在代理对象调用doSomething方法时,它会先调用DynamicProxy类的invoke方法,在invoke方法中,我们将先输出一句话“before method”,然后调用目标对象的方法,最后输出一句话“after method”。 Java动态代理的优点是可以在运行时期间动态生成代理对象,不需要预先定义代理类,这样可以大大减少代码量。同时,Java动态代理也具有很好的灵活性,可以对不同的目标对象生成不同的代理对象,实现不同的处理逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值