基于Python psutil库设计一个网络流量监视程序

        最近做了一个局域网文件传输系统,需要网络流量监视,市面上的安全软件具有此功能,但是界面太小不方便查看,因此我设计了这个网络流量监视器。

程序界面:

        首先,查阅网络资料,我们可以用psutil库获取计算机的网络端口信息,具体用法是

psutil.net_io_counters(pernic=True)

调用这个函数,我们可以看到一大串信息

 为了确定这个函数的返回的对象类型,我们不妨调用一下  type()

可以看到这是一个字典类型的数据,其数据结构为{“端口名”:某种对象,....}

我们可以用“.”运算符获取其属性的值,例如

在这个程序中,我们只需要提取其中 bytes_sentbytes_recv,就可以提取到单个端口的当前收发字节数,对于多个端口,用一个for循环即可;

    def get_network_bytes():
        """
        获取当前端口收发字节数
        :return:当前各个端口的收发字节数
        """
        network_io = psutil.net_io_counters(pernic=True)
        bytes_now = {}
        for interface, io in network_io.items():
            bytes_now[interface] = {'上传字节数': io.bytes_sent, '下载字节数': io.bytes_recv}
        return bytes_now

获取了当前的收发字节数,结合上一次的收发字节数,就可以计算当前的网络速率,用当前的收发字节数减去第一次的收发字节数,就可以得到总共的流量,方便表示,我们可以设计两个格式化网络速率的函数:

    def format_speed(speed):
        """
        获取直观的网速格式
        :param speed: 网速 Byte/s
        :return: 格式化网速
        """
        if speed < 1024:
            return f"{speed} B/s"
        elif speed < 1048576:
            return f"{speed / 1024:.2f} KB/s"
        else:
            return f"{speed / 1048576:.2f} MB/s"

    def format_netdata(da):
        """
        获取直观的流量格式
        :param da: 字节数
        :return: 格式化字节数
        """
        if da < 1024:
            return f"{da} B"
        elif da < 1048576:
            return f"{da / 1024:.2f} KB"
        elif da < 1073741824:
            return f"{da / 1048576:.2f} MB"
        else:
            return f"{da / 1073741824:.2f} GB"

将以上的代码进行封装,加上亿点点细节,得到程序的源代码:

import datetime
import os
import psutil
from tabulate import tabulate
import time


class NetworkTrafficMonitor:
    """
    网络流量监视工具
    """

    def __init__(self):
        print("网络流量监视器启动..........")

    def get_network_bytes(self):
        """
        获取当前端口收发字节数
        :return:当前各个端口的收发字节数
        """
        network_io = psutil.net_io_counters(pernic=True)
        bytes_now = {}
        for interface, io in network_io.items():
            bytes_now[interface] = {'上传字节数': io.bytes_sent, '下载字节数': io.bytes_recv}
        return bytes_now

    def format_speed(self, speed):
        """
        获取直观的网速格式
        :param speed: 网速 Byte/s
        :return: 格式化网速
        """
        if speed < 1024:
            return f"{speed} B/s"
        elif speed < 1048576:
            return f"{speed / 1024:.2f} KB/s"
        else:
            return f"{speed / 1048576:.2f} MB/s"

    def format_netdata(self, da):
        """
        获取直观的流量格式
        :param da: 字节数
        :return: 格式化字节数
        """
        if da < 1024:
            return f"{da} B"
        elif da < 1048576:
            return f"{da / 1024:.2f} KB"
        elif da < 1073741824:
            return f"{da / 1048576:.2f} MB"
        else:
            return f"{da / 1073741824:.2f} GB"

    def cmd_mode(self):
        """
        cmd模式下的监视器
        :return:
        """
        last_speed = self.get_network_bytes()  # 获取一次当前收发字节数,用于计算网速
        raw_speed = self.get_network_bytes()  # 获取一次当前收发字节数,用于累积计算流量

        #创建初始字节数字典用于运算
        raw = {}
        for interface, bytes1 in raw_speed.items():
            raw[interface] = [bytes1['上传字节数'], bytes1['下载字节数']]

        while True:
            time.sleep(1) # 等待一秒
            network_speeds = self.get_network_bytes()#获取一次当前收发字节数

            # 创建上一次字节数字典用于运算
            last = {}
            for interface, bytes1 in last_speed.items():
                last[interface] = [bytes1['上传字节数'], bytes1['下载字节数']]

            data = []#用于显示数据的列表
            for interface, bytes1 in network_speeds.items():
                data.append([interface, self.format_speed(bytes1['上传字节数'] - last[interface][0]),
                             self.format_speed(bytes1['下载字节数'] - last[interface][1]),
                             self.format_netdata(bytes1['上传字节数'] - raw[interface][0]),
                             self.format_netdata(bytes1['下载字节数'] - raw[interface][1])])

            #用tabulate库中tabulate函数生成表格对象
            headers = ["接口", "上传速率", "下载速率", "累积上传", "累积下载"]
            table = tabulate(data, headers, tablefmt="grid")

            # 打印输出表格
            os.system("cls")
            print(f"_____________________________________________________________________________________\n"
                  f"|                                                                                   |\n"
                  f"|       正在监视网络连接...       当前时间:{str(datetime.datetime.now())[:-3]}                  |\n"
                  f"|                                                                          作者:Y.d|")
            print(table)

            # 更新数据
            last_speed = network_speeds

if __name__ == '__main__':
    monitor = NetworkTrafficMonitor()
    monitor.cmd_mode()

画一个小图标:

用pyinstaller打包:

pyinstaller -F -i 1.bmp 网络流量监视器.py

实际效果:

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y.d大仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值