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相关推荐

  1. 每日思考第 76 期:真正的死亡是被人遗忘

    每日思考 专栏每周日更新,本期覆盖 20210426~20210502. 本期分享我这周的所思所想所见所闻. 210426:为什么人们很少质疑自己的看法 人们普遍存在一个认知缺陷,喜欢接受和自己假设相 ...

  2. mac 菜单栏图标删除_您可以在Mac菜单栏上显示的所有内置图标(可能)

    mac 菜单栏图标删除 Apple's operating system's menu bar is truly old school; it's been around for as long as ...

  3. 怎样在ipad上显示pc_如何将iPad用作PC或Mac的辅助显示器

    怎样在ipad上显示pc Multiple monitors are awesome. With two screens side by side, you can more easily see a ...

  4. mac系统上显示隐藏文件或者文件夹

    话不多说,mac上显示隐藏文件和文件夹的快捷键如下: shift + command + 句号 如图: 不谢.

  5. Github每日精选(第56期):支持多语言的文字识别EasyOCR

    EasyOCR EasyOCR一款好用的OCR,支持80多种语言和所有流行的书写脚本,包括拉丁语.汉语.阿拉伯语.德瓦纳加里语.西里尔语等. OCR (Optical Character Recogn ...

  6. Github每日精选(第24期):python的浏览器MechanicalSoup

    MechanicalSoup 可能你看到MechanicalSoup,就会想起BeautifulSoup,是的,这两个的功能用起来差不多,只是MechanicalSoup做的更多一点. Mechani ...

  7. Github每日精选(第48期):SQLite下的知识库memos

    memos memos 是一个开源的.自托管的知识库,可与 SQLite db 文件一起使用. 使用SQLite db还是很有必要的,因为有的时候我们需要把我们的日志进行转移,直接把数据库拷走就可以了 ...

  8. Github每日精选(第77期):Go (Golang) 编写的 HTTP Web 框架gin

    Gin Gin 是一个用 Go (Golang) 编写的 Web 框架.由于httprouter,它具有类似 martini 的 API,性能提高了 40 倍.如果您需要性能和良好的生产力,您一定会喜 ...

  9. Github每日精选(第79期):虚拟数据生成库faker

    faker Faker是一个Python包,可以为你生成假数据.无论您是需要引导您的数据库.创建美观的 XML 文档.填写您的持久性以对其进行压力测试,还是对从生产服务中获取的数据进行匿名化,Fake ...

最新文章

  1. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发
  2. js格式化json格式的日期
  3. JavaScript设计模式与开发实践——JavaScript的多态
  4. 数据元素和数据项的区别
  5. 测验8: 程序设计方法学 (第8周)
  6. libevent 源码阅读 Ubuntu下muduo库的安装与使用
  7. ecshop静态、 ecshop伪静态、ecshop伪静态设置详细方法、ECSHOP静态化方法
  8. 自己调试接口遇到的错误记录
  9. 链表和顺序表的一些区别
  10. 苹果画画软件_入手新iPad,这几款绘画软件必不可少!
  11. 生信常用分析图形绘制02 -- 解锁火山图真谛!
  12. Python Pyside2新手应用淘宝客API接口简单获取淘宝客大额推广优惠券的实现
  13. 第九讲 数据采集:用八爪鱼采集微博评论
  14. jvm核心技术梳理(持续更新)
  15. 数字信号处理的典型应用
  16. 计算机里的文件夹可以加密吗,如何加密电脑中的文件夹
  17. Python助你抢红包
  18. 谷俊丽分享之基于深度学习的大数据挖掘
  19. 软件工程毕业设计课题(21)基于JAVA毕业设计电子书小说网站系统毕设作品项目
  20. 变分推断(Variational Inference)解析

热门文章

  1. 2023.1.13单词打卡
  2. 使用Windbg时遇到的几个典型问题说明
  3. more命令 – 显示文本文件内容
  4. java removeat,在c#中 RemoveAt、 Remove、delete用法区别
  5. python3.8使用from aip import AipBodyAnalysis报错 cannot import name AipBodyAnalysis解决办法
  6. APPIcon -(自留)
  7. 电脑上的图片转文字工具怎么用?
  8. 看看你属于哪个阶层?中国阶层报告 2009第一版(转载)
  9. 计算机给文件重命名快捷键,实用电脑小技巧:批量重命名文件常用的小工具也可以设快捷键...
  10. 每日自动签到工具的制作思路