Github每日精选(第76期):在 Mac 状态栏上显示进程流量的监视器ITraffic-monitor-for-mac

news2024/11/26 0:28:48

ITraffic-monitor-for-mac

ITraffic-monitor-for-mac 在 Mac 状态栏上显示进程流量的监视器,在windows我们的流量可以通过电脑管家或者360进行显示,在进行网络编程的时候,这个确实帮了不少忙,但是咱Mac下,显示网络状况就没有那么方便了,但是我们可以在mac下的监视中找到网络的监控,但是这个藏得太深,ITraffic-monitor-for-mac就是为了这个需求而生的,ITraffic-monitor-for-mac大部分的代码采用的是swift语言,工程代码量并不大,很适合刚开始学习swift语言的同学。

github上的地址在这里。

在这里插入图片描述
看看这个软件,对流量的监控是不是很方便,是不是很windows化。

安装

macOS 版本应该 >= 10.15,因为项目使用 swiftUI,安装的方式比较简单,直接下载app就可以进行mac下的安装,地址在这里。

如果使用brew

rew install itraffic

更新:

brew update && brew upgrade itraffic

我们来看看具体实现的代码。

代码分析

能把网络的监控展示成这么方便,确实是挺好用的,这个最主要的部分是ui的部分和网络监控部分。

public func startListenNetwork() {
        let duration = 2
        let nettopPath = Bundle.main.path(forResource: "nettop-line", ofType: nil)!
        let task = shellPipe("\"\(nettopPath)\" -P -d -L 0 -J bytes_in,bytes_out -t external -s \(duration) -c") { [self] output in
            tryToMakeAppSleepDeep()
            
            let rows = output.components(separatedBy: "|SPLIT|").map { String($0) }
            
            var totalInBytes = 0
            var totalOutBytes = 0
            let entities: [ProcessEntity] = rows.map { self.parser(text: $0, duration: duration) }.compactMap { entity-> ProcessEntity? in
                if (entity == nil) {
                    return nil;
                }
                totalInBytes += entity?.inBytes ?? 0
                totalOutBytes += entity?.outBytes ?? 0
                return entity
            }
            DispatchQueue.main.async {
                self.statusDataModel.update(totalInBytes: totalInBytes, totalOutBytes: totalOutBytes)
                self.viewModel.updateData(newItems: entities)
            }
        }
        task.resume()
    }

开始进行监控,可以看出,他使用的是nettop-line 这个开源项目,地址在这里。

nettop-line 中读回来了网络信息,再对网络信息进行处理。

func parser(text: String, duration: Int) -> ProcessEntity? {
        let item = text.split(separator: ",")
        if item.count < 3 {
            return nil
        }
        let inBytes = (Int(item[1]) ?? 0) / duration
        let outBytes = (Int(item[2]) ?? 0) / duration

        let nameAndPid = item[0].split(separator: ".")
        let pid = nameAndPid[nameAndPid.count - 1]
        var name = nameAndPid
        name.removeLast()

        return ProcessEntity(pid: Int(pid) ?? 0, name: name.joined(separator: "."), inBytes: inBytes, outBytes: outBytes)
    }

    @discardableResult
    func shellPipe(_ args: String..., onData: ((String) -> Void)? = nil, didTerminate: (() -> Void)? = nil) -> Process {
        let task = Process()
        let pipe = Pipe()

        task.standardOutput = pipe
        task.standardInput = Pipe()
        task.executableURL = URL(fileURLWithPath: "/bin/bash")
        task.arguments = ["-c"] + args

        var buffer = Data()
        let outHandle = pipe.fileHandleForReading
        var str = ""
        var data = Data()
        outHandle.readabilityHandler = { _ in
            data = outHandle.availableData

            if data.count > 0 {
                buffer += data
                str = String(data: buffer, encoding: String.Encoding.utf8) ?? ""
                if str.last?.isNewline == true {
                    buffer.removeAll()
                    onData?(str)
                }
                outHandle.waitForDataInBackgroundAndNotify() // todo it seems that memory leak here. Not sure how to fix it now.
            } else {
                buffer.removeAll()
            }
        }
        outHandle.waitForDataInBackgroundAndNotify()

        task.terminationHandler = { _ in
            try? outHandle.close()
            didTerminate?()
        }

        DispatchQueue(label: "shellPipe-\(UUID().uuidString)", qos: .background, attributes: .concurrent).async {
            do {
                try task.run()
            } catch {
                print("shell pipe executed with error", error)
            }
        }

        return task
    }

shellPipe 中执行命令行,通过命令行获取网络的信息。

ITraffic-monitor-for-mac 的分析就简单的写到这里,有兴趣的话可以进行他的ui代码的学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

oracle的trunc函数改为hive的函数

trunc函数可以截取oracle的日期 select trunc(sysdate,yyyy) from dual;--返回当年第一天 select trunc(sysdate,mm) from dual; --返回当月第一天 select trunc(sysdate,dd) from dual;--返回当前年月日 select trunc(sysdate,d) from dual; --返回当前星期的第一天(星期日) …

怎么把电脑硬盘文件恢复回来?跟着我这么做

电脑的硬盘数据丢失了&#xff0c;用了很多方法都没有办法找回来&#xff0c;电脑文件还能找回来吗&#xff1f;硬盘文件恢复要怎么操作&#xff1f;这时候就要寻求第三方数据恢复软件来恢复数据了。下面有详细的操作步骤&#xff0c;简单几步就可以找回你消失的硬盘数据&#…

leetcode90子集II-回溯-Java

说明&#xff1a; 问题描述来源leetcode 题解1&#xff1a; /*** author xin麒* date 2022/12/15 11:18* 给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。* 解集 不能 包含重复的子集。返回…

DPDK介绍

一、什么是DPDK&#xff1f; DPDK 全称是数据平面开发套件 (Data Plane Development Kit)&#xff0c;由 6WIND,Intel 等多家公司开发&#xff0c;主要基于 Linux 系统运行&#xff0c;用于快速数据包处理的函数库与驱动集合&#xff0c;可以极大提高数据处理性能和吞吐量&…

DGIOT边缘主机功能——6USB串口替代普通dtu/网关的设备接入

[小 迪 导读]&#xff1a; dgiot边缘主机自带6个USB口、2个RS232串口以及2个网口&#xff0c;可用组态对边缘主机上的USB口、串口和网口等上的外设进行可视化管理&#xff0c;包括如下功能&#xff1a; 通过6个USB口外接USB转485转换器模拟6个485转以太网/无线的网关/dtu2个RS…

JavaWeb——在线音乐播放器

文章目录效果演示1. 创建SpringBoot项目2. 数据库设计3. 配置数据库和xml4. 登录模块设计4.1 创建User类4.2 创建对应的Mapper和Controller5. 实现登录5.1 登录的请求和响应设计5.2 请求实现5.3 响应实现5.31 设置统一的响应体类工具类5.32 创建常量工具类5.33 优化后完整代码6…

纳米源表测试软件更新,新增太阳能电池测试、双通道脉冲扫描

源表在电测行业中应用十分广泛&#xff0c;尤其是在需求高精度的半导体、纳米器件和材料、太阳能电池、印刷电子技术等领域有着举足轻重的地位&#xff1b;而源表软件则可以实现源表的远程控制&#xff0c;通过在软件控制源表进行配置或者测量&#xff0c;也可以对测量的数据和…

大学生游戏静态HTML网页设计 (HTML+CSS+JS仿英雄联盟网站15页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

2.5.9 使用 systemd 管理 MySQL 服务器实例

2.5.9 使用 systemd 管理 MySQL 服务器实例systemd 概述为 MySQL 配置 systemd使用 systemd 配置多个 MySQL 实例从 mysqld_safe 迁移到 systemd如果在以下 Linux 平台上使用 RPM 或 Debian 软件包安装 MySQL &#xff0c;则服务器启动和关闭由 systemd 管理&#xff1a; RPM …

时间序列-预测-模型-2020:Informer【比Transformer更有效的长时间序列预测】【在对性能影响不大的前提下降低复杂度】

摘要 时序预测这个领域的工作与很多其他领域类似,我们可以按“深度学习”方法的引入作为分界线。在此之前的方法是传统的时序建模方法,比如移动平均、自回归、以及结合差分的ARIMA模型等,有着悠久的历史以及基于理论基础的可解释性。但是,这类方法一般要求时间序列是平稳的…

视频转文字怎么弄?建议收藏这些方法

小伙伴们在闲暇之余&#xff0c;会不会通过一些网课的学习&#xff0c;来提高自己呢&#xff1f;有时我们网课学习来不及做笔记&#xff0c;但是重复观看又比较麻烦&#xff0c;这时我们就可以通过将视频转换成文字&#xff0c;这样就能够清楚明了的知道视频的讲解内容了。那你…

springcloud整合Hystrix

作用 1、服务降级 触发情况&#xff1a;程序运行异常、超时、服务熔断触发服务降级、线程池/信号量打满也会触发服务降级 2、服务熔断 直接拒绝访问&#xff0c;即使有正确的访问也会短路 3、服务限流 排队有序进行 构建服务 1、建module provider-hystrix-payment8001 2、改…

mac 好用的ps修图软件 Pixelmator Pro

Pixelmator Pro Pixelmator Pro 是一款任何人都可以使用的专业图像编辑工具。Pixelmator Pro旨在使每个人都可以使用最强大的专业图像编辑工具。拥有大量用于编辑和修饰照片&#xff0c;创建图形设计&#xff0c;绘画&#xff0c;绘制矢量图形以及添加令人惊叹的效果的工具&…

sdl 渲染旋转视频的方法

文章目录前言一、如何实现&#xff1f;1、计算边框大小2、计算缩放大小3、逆运算视频宽高二、完整代码三、使用示例总结前言 一般情况下播放视频时不需要旋转&#xff0c;但是如果是移动端录制的视频有时会出现rotate参数&#xff0c;且视频宽高也是互换的&#xff0c;如果直接…

为什么使用MQ?RabbitMQ概念

个人博客地址&#xff1a; http://xiaohe-blog.top/ 文章目录1. MQ基本概念1.1 MQ简述1.2 MQ的优势1.3 MQ的劣势2. RabbitMQ基本概念2.1 RabbitMQ特点2.2 AMQP协议1. MQ基本概念 1.1 MQ简述 MQ 全称 &#xff1a;Message Queue&#xff08;消息队列&#xff09;&#xff0c;是…

音效、配乐素材网站,免费商用

视频剪辑没素材&#xff1f;找不到热门音效&#xff1f;找不到好听的配乐&#xff1f; 有了这几个网站&#xff0c;承包你的所有音效、配乐&#xff0c;重点是免费&#xff01;&#xff01;&#xff01;1、菜鸟图库 https://www.sucai999.com/audio.html?vNTYwNDUx菜鸟图库网&…

【猿如意】如何在mac上搭建QT环境

作为一个代码菜鸡&#xff0c;平时主要用windows或者linux进行开发&#xff0c;但是家里有一个mac&#xff0c;平时要搭环境要找半天就很费劲。今天终于发现一个好用的平台&#xff0c;常用的开发工具都有惹。真香&#xff01; 什么是猿如意&#xff1f; 猿如意是一款面向开发…

[附源码]Nodejs计算机毕业设计基于的餐厅管理系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

如何注册网站?网站注册费用多少?

很多企业或者公司都会考虑注册自己的网站&#xff0c;那么如何注册网站呢&#xff1f;网站注册费用多少呢&#xff1f;具体来说注册网站是包含注册域名和制作网站&#xff0c;下面一同为大家解答如何注册网站。 一、注册域名 一个网站是必须要有域名才能访问&#xff0c;注册可…

一个 MySQL 隐式转换的坑,差点把服务器整崩溃了

本来是一个平静而美好的下午&#xff0c;其他部门的同事要一份数据报表临时汇报使用&#xff0c;因为系统目前没有这个维度的功能&#xff0c;所以需要写个SQL马上出一下&#xff0c;一个同事接到这个任务&#xff0c;于是开始在测试环境拼装这条 SQL&#xff0c;刚过了几分钟&…