Github每日精选(第76期):在 Mac 状态栏上显示进程流量的监视器ITraffic-monitor-for-mac
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 = 2let 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 intryToMakeAppSleepDeep()let rows = output.components(separatedBy: "|SPLIT|").map { String($0) }var totalInBytes = 0var totalOutBytes = 0let entities: [ProcessEntity] = rows.map { self.parser(text: $0, duration: duration) }.compactMap { entity-> ProcessEntity? inif (entity == nil) {return nil;}totalInBytes += entity?.inBytes ?? 0totalOutBytes += entity?.outBytes ?? 0return 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) / durationlet outBytes = (Int(item[2]) ?? 0) / durationlet nameAndPid = item[0].split(separator: ".")let pid = nameAndPid[nameAndPid.count - 1]var name = nameAndPidname.removeLast()return ProcessEntity(pid: Int(pid) ?? 0, name: name.joined(separator: "."), inBytes: inBytes, outBytes: outBytes)}@discardableResultfunc shellPipe(_ args: String..., onData: ((String) -> Void)? = nil, didTerminate: (() -> Void)? = nil) -> Process {let task = Process()let pipe = Pipe()task.standardOutput = pipetask.standardInput = Pipe()task.executableURL = URL(fileURLWithPath: "/bin/bash")task.arguments = ["-c"] + argsvar buffer = Data()let outHandle = pipe.fileHandleForReadingvar str = ""var data = Data()outHandle.readabilityHandler = { _ indata = outHandle.availableDataif data.count > 0 {buffer += datastr = 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 = { _ intry? 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代码的学习。
Github每日精选(第76期):在 Mac 状态栏上显示进程流量的监视器ITraffic-monitor-for-mac相关推荐
- 每日思考第 76 期:真正的死亡是被人遗忘
每日思考 专栏每周日更新,本期覆盖 20210426~20210502. 本期分享我这周的所思所想所见所闻. 210426:为什么人们很少质疑自己的看法 人们普遍存在一个认知缺陷,喜欢接受和自己假设相 ...
- mac 菜单栏图标删除_您可以在Mac菜单栏上显示的所有内置图标(可能)
mac 菜单栏图标删除 Apple's operating system's menu bar is truly old school; it's been around for as long as ...
- 怎样在ipad上显示pc_如何将iPad用作PC或Mac的辅助显示器
怎样在ipad上显示pc Multiple monitors are awesome. With two screens side by side, you can more easily see a ...
- mac系统上显示隐藏文件或者文件夹
话不多说,mac上显示隐藏文件和文件夹的快捷键如下: shift + command + 句号 如图: 不谢.
- Github每日精选(第56期):支持多语言的文字识别EasyOCR
EasyOCR EasyOCR一款好用的OCR,支持80多种语言和所有流行的书写脚本,包括拉丁语.汉语.阿拉伯语.德瓦纳加里语.西里尔语等. OCR (Optical Character Recogn ...
- Github每日精选(第24期):python的浏览器MechanicalSoup
MechanicalSoup 可能你看到MechanicalSoup,就会想起BeautifulSoup,是的,这两个的功能用起来差不多,只是MechanicalSoup做的更多一点. Mechani ...
- Github每日精选(第48期):SQLite下的知识库memos
memos memos 是一个开源的.自托管的知识库,可与 SQLite db 文件一起使用. 使用SQLite db还是很有必要的,因为有的时候我们需要把我们的日志进行转移,直接把数据库拷走就可以了 ...
- Github每日精选(第77期):Go (Golang) 编写的 HTTP Web 框架gin
Gin Gin 是一个用 Go (Golang) 编写的 Web 框架.由于httprouter,它具有类似 martini 的 API,性能提高了 40 倍.如果您需要性能和良好的生产力,您一定会喜 ...
- Github每日精选(第79期):虚拟数据生成库faker
faker Faker是一个Python包,可以为你生成假数据.无论您是需要引导您的数据库.创建美观的 XML 文档.填写您的持久性以对其进行压力测试,还是对从生产服务中获取的数据进行匿名化,Fake ...
最新文章
- 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发
- js格式化json格式的日期
- JavaScript设计模式与开发实践——JavaScript的多态
- 数据元素和数据项的区别
- 测验8: 程序设计方法学 (第8周)
- libevent 源码阅读 Ubuntu下muduo库的安装与使用
- ecshop静态、 ecshop伪静态、ecshop伪静态设置详细方法、ECSHOP静态化方法
- 自己调试接口遇到的错误记录
- 链表和顺序表的一些区别
- 苹果画画软件_入手新iPad,这几款绘画软件必不可少!
- 生信常用分析图形绘制02 -- 解锁火山图真谛!
- Python Pyside2新手应用淘宝客API接口简单获取淘宝客大额推广优惠券的实现
- 第九讲 数据采集:用八爪鱼采集微博评论
- jvm核心技术梳理(持续更新)
- 数字信号处理的典型应用
- 计算机里的文件夹可以加密吗,如何加密电脑中的文件夹
- Python助你抢红包
- 谷俊丽分享之基于深度学习的大数据挖掘
- 软件工程毕业设计课题(21)基于JAVA毕业设计电子书小说网站系统毕设作品项目
- 变分推断(Variational Inference)解析
热门文章
- 2023.1.13单词打卡
- 使用Windbg时遇到的几个典型问题说明
- more命令 – 显示文本文件内容
- java removeat,在c#中 RemoveAt、 Remove、delete用法区别
- python3.8使用from aip import AipBodyAnalysis报错 cannot import name AipBodyAnalysis解决办法
- APPIcon -(自留)
- 电脑上的图片转文字工具怎么用?
- 看看你属于哪个阶层?中国阶层报告 2009第一版(转载)
- 计算机给文件重命名快捷键,实用电脑小技巧:批量重命名文件常用的小工具也可以设快捷键...
- 每日自动签到工具的制作思路