【python】TCP测速程序

news2024/9/21 2:48:56

一、服务端

下面是一个简单的 Python 服务端程序的示例,使用标准库中的 socket 模块来建立一个 TCP 服务器。该服务器接收客户端的连接请求,客户端发送一定大小的数据流以测试 TCP 带宽。
实际场景中带宽测试可能需要更复杂的逻辑来确保测试的准确性。

import socket
import time

def main():
   # 配置服务器地址和端口
   host = '0.0.0.0'
   port = 12345

   # 创建 socket 对象
   with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
       # 绑定地址和端口
       server_socket.bind((host, port))
       # 开始监听,设置最大连接数
       server_socket.listen(5)
       print(f"Server listening on port {port}...")

       # 接受客户端连接
       client_conn, client_addr = server_socket.accept()
       print(f"Accepted connection from {client_addr}")

       # 开始接收数据
       start_time = time.time()
       total_received = 0
       try:
           while True:
               # 接收数据,这里的 1024 是接收数据的缓冲大小,单位是字节
               data = client_conn.recv(1024)
               if not data:
                   break
               total_received += len(data)
       finally:
           end_time = time.time()
       
       # 关闭客户端连接
       client_conn.close()

       # 计算并输出带宽测试结果
       duration = end_time - start_time
       speed = (total_received / (duration * 1024 * 1024))  # Mbps
       print(f"Received {total_received} bytes in {duration:.2f} seconds.")
       print(f"Speed: {speed:.2f} Mbps.")

if __name__ == "__main__":
   main()


为了运行此服务端程序,需要将其保存为 .py 文件,例如 tcp_server.py,然后在终端或命令行中执行它:

python3 tcp_server.py

客户端可以使用相同的 socket 库编写,或者使用现有的带宽测试工具(例如 iperf 或 netcat)来连接并发送数据。
确保服务器和客户端处于多个不同网络段的测试更能准确反映真实的网络带宽情况,而不仅仅是局域网或同一设备间的带宽。

二、客户端

客户端发送指定大小的数据,服务器接收数据。客户端在发送指定次数的数据后,统计总共消耗的时间来计算平均带宽。以下是一个简单的 Python 客户端示例代码,它使用 socket 库来实现 TCP 通信:

import socket
import time

# 服务器的IP地址和端口号
SERVER_IP = '192.168.1.1'
SERVER_PORT = 12345
# 数据块大小(字节)
BUFFER_SIZE = 1024 * 1024  # 1MB
# 测试发送次数
ITERATIONS = 10

def main():
   # 初始化客户端socket
   client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   
   # 连接到服务器
   client_socket.connect((SERVER_IP, SERVER_PORT))
   
   # 准备发送的测试数据,确保每次发送的大小一致
   data = b'a' * BUFFER_SIZE

   # 记录测试开始的时间
   start_time = time.time()

   # 循环指定次数发送数据
   for _ in range(ITERATIONS):
       # 发送数据
       client_socket.sendall(data)

   # 记录测试结束的时间
   end_time = time.time()

   # 关闭socket连接
   client_socket.close()

   # 计算耗费的总时间
   total_time = end_time - start_time
   print(f"Total time for {ITERATIONS} iterations: {total_time:.2f} seconds")

   # 计算平均速度(带宽)
   total_bytes_sent = BUFFER_SIZE * ITERATIONS
   average_bandwidth = total_bytes_sent / total_time  # in bytes per second
   average_bandwidth_mbps = (average_bandwidth * 8) / (1024 * 1024)  # convert to Mbps
   print(f"Average bandwidth: {average_bandwidth:.2f} Bps or {average_bandwidth_mbps:.2f} Mbps")

if __name__ == '__main__':
   main()

该程序首先创建了一个 TCP 客户端并连接到服务器。然后,在循环中发送数据,并计算发送这些数据所需的总时间。最后,它关闭 socket,并计算平均带宽。
该程序假设服务器已就绪并准备接收数据。服务器程序应该能够处理来自客户端的连接和数据接收。
这个程序是同步发送的,也就是说在发送过程中客户端会等待服务器接收完毕后再发送,这对于计算准确的带宽是重要的。还需要注意 TCP 的启动慢和拥塞控制算法可能会影响实际的带宽,因此得到的结果仅为近似值。

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

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

相关文章

Android AAudio

文章目录 基本概念启用流程基本流程HAL层对接数据流计时模型调试 基本概念 AAudio 是 Android 8.0 版本中引入的一种音频 API。 AAudio 提供了一个低延迟数据路径。在 EXCLUSIVE 模式下,使用该功能可将客户端应用代码直接写入与 ALSA 驱动程序共享的内存映射缓冲区…

基于springboot在线考试系统源码和论文

网络的广泛应用给生活带来了十分的便利。所以把在线考试管理与现在网络相结合,利用java技术建设在线考试系统,实现在线考试的信息化。则对于进一步提高在线考试管理发展,丰富在线考试管理经验能起到不少的促进作用。 在线考试系统能够通过互…

前端实现截图并下载

原理: 使用一个名为html2canvas的JavaScript库。这个库允许你将当前的HTML内容渲染到一个canvas元素上,然后将其转换为图像并进行下载。 你需要在项目中引入html2canvas库。你可以从官方网站(https://html2canvas.hertzen.com/)下载&#xf…

编译原理期末大题步骤——例题

一、预测分析方法步骤 提取左公因子,消除左递归判断文法是否为LL(1)文法若是,构造预测分析表;否则,不能进行分析。根据预测分析表对输入串进行分析 例子: 文法G[E]: …

selenium python 实现基本自动化测试的示例代码

安装selenium 打开命令控制符输入:pip install -U selenium 火狐浏览器安装firebug:www.firebug.com,调试所有网站语言,调试功能 Selenium IDE 是嵌入到Firefox 浏览器中的一个插件,实现简单的浏览器操 作的录制与回…

如何克隆驱动器,不同的操作系统有不同的推荐软件

你需要将Windows或macOS安装迁移到新驱动器吗?你可以使用服务备份文件,也可以创建数据的完整一对一副本。通过克隆你的驱动器,你可以创建一个精确的副本。 一些业务级别的备份服务,如IDrive和Acronis,具有内置的磁盘克隆功能,是对正常文件备份的补充。但对于一次性克隆(…

BitMap解析(一)

文章目录 前言数据结构添加与删除操作 JDK中BitSet源码解析重要成员属性初始化添加数据清除数据获取数据size和length方法集合操作:与、或、异或 前言 为什么称为bitmap? bitmap不仅仅存储介质以及数据结构不同于hashmap,存储的key和value也…

在python里面探索web框架

一、常识性知识 python Web框架三巨头:Flask(简单易学)、Django(复杂庞大)、FastAPI 1. Django:Django是一个高级的Web框架,它提供了强大的功能和工具,用于快速开发复杂的Web应用程序。 2. Flask&#xff…

海外社媒运营为什么需要选择优质IP代理?

跨境电商卖家尤其需要关注海外社媒运营,想要更好地运营Instagram、Facebook、TikTok 或 Twitter等,挖掘社媒潜力需要采取战略方法,而社交媒体IP代理在这一活动中发挥着至关重要的作用,下面为你详细介绍。 一、社交媒体代理IP及其运…

新年喝酒有讲究,怎么喝葡萄酒呢?

中国的新年有着独特又深远的意义,无论人在天涯海角,回家团圆是每个人的心愿。新年亲朋好友欢聚一堂,没有酒哪有气氛,所以喝酒是必不可少的活动项目。云仓酒庄的品牌雷盛红酒LEESON分享那么,新年喝啥酒,葡萄…

C# 一看就懂的装箱拆箱案例

文章目录 装箱(Boxing)拆箱(Unboxing)编程语言中的装箱与拆箱优缺点 在C#中,装箱(Boxing)和拆箱(Unboxing)是值类型与引用类型之间相互转换的过程。 装箱(Box…

【Qt打包】Qt打包生成可安装exe文件

第三方打包 gitee 项目地址:https://gitee.com/hudejie/universal-software-installation-package 纯净包备份(v0.1):https://download.csdn.net/download/weixin_45863921/88720027 1 项目介绍 作者项目介绍: 基于NS…

通用机V8R6集群部署_1主1备1见证_图形化_Centos7

KingbaseES 提供数据库部署工具进行数据库集群的部署。KingbaseES 提供基于图形化和命令行操作的集群部署方式,本文档主要用于指导不支持 GUI 的服务器上的 KingbaseES 集群部署工作。 集群简介 KingbaseES软件能够提供一主一备以及一主多备的高可用集群架构&…

Python轴承故障诊断 (十)基于VMD+CNN-Transfromer的故障分类

目录 1 变分模态分解VMD的Python示例 2 轴承故障数据的预处理 2.1 导入数据 2.2 故障VMD分解可视化 3 基于VMDCNN-Transformer的轴承故障诊断分类 3.1 定义VMD-CNN-Transformer分类网络模型 3.2 设置参数,训练模型 3.3 模型评估 代码、数据如下&#xff1a…

大图切片预览

文章目录 前言处理流程完整代码前端预览 前言 最近有需求,前端要预览百兆以上的大图,这直接访问应该就不太行了,系统打开都在加载好一会儿,刚好从事的又是 gis 行业,于是打算用类似加载地图的方式来切片加载大图。这里…

【HarmonyOS】掌握 Stage 模型的核心概念与应用

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

谷歌提出「边界注意力」模型,实现超越像素级检测精度!微弱边界也逃不过

有些情况下,当面临分辨率较低的图像时,可能会在进行诸如目标检测和图像分割等任务时遇到一些挑战和阻碍。这是因为低分辨率图像可能丢失了细节信息,使得计算机视觉系统难以准确捕捉和理解图像中的关键特征。在这种背景下,传统的方…

Poi实现根据word模板导出-图表篇

往期系列传送门: Poi实现根据word模板导出-文本段落篇 (需要完整代码的直接看最后位置!!!) 前言: 补充Word中图表的知识: 每个图表在word中都有一个内置的Excel,用于…

kubernetes 容器监控 Sysdig Falco

开头语 写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 Sysdig 监控容器系统调用 介绍 资料 Sysdig:一个非常强大的系统监控、分…

PostgreSQL的常见错误和解决方法

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 在学习新的东西时,会犯很多的错误,会遇到很多坑。我们在填坑与犯错中不断进步成长。 以下是在学习pgsql中…