当前位置: 首页 > news >正文

【python】TCP测速程序

一、服务端

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

import socket
import timedef 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 = 0try:while True:# 接收数据,这里的 1024 是接收数据的缓冲大小,单位是字节data = client_conn.recv(1024)if not data:breaktotal_received += len(data)finally:end_time = time.time()# 关闭客户端连接client_conn.close()# 计算并输出带宽测试结果duration = end_time - start_timespeed = (total_received / (duration * 1024 * 1024))  # Mbpsprint(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 通信:

1. 发送

import socket
import time# 服务器的IP地址和端口号
SERVER_IP = '192.168.1.1'
SERVER_PORT = 12345
# 数据块大小(字节)
BUFFER_SIZE = 1024 * 1024  # 1MB
# 测试发送次数
ITERATIONS = 10def main():# 初始化客户端socketclient_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_timeprint(f"Total time for {ITERATIONS} iterations: {total_time:.2f} seconds")# 计算平均速度(带宽)total_bytes_sent = BUFFER_SIZE * ITERATIONSaverage_bandwidth = total_bytes_sent / total_time  # in bytes per secondaverage_bandwidth_mbps = (average_bandwidth * 8) / (1024 * 1024)  # convert to Mbpsprint(f"Average bandwidth: {average_bandwidth:.2f} Bps or {average_bandwidth_mbps:.2f} Mbps")if __name__ == '__main__':main()

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

2.接收

import socket
import timewhile True:s = socket.socket()addr=("服务端地址",服务端口)print("{}:wait for server connect...".format(time.ctime()))while True:#time.sleep(1)try:res=s.connect(addr)print(res)if not res:print("connect server",addr)breakexcept:passnum = 0data_len = 0buf_maxsize = 4096loop_times = 100000data_maxsize = buf_maxsize*loop_timesbegin_time_ns = time.time_ns()while True:try:if data_len == 0:begin_time = time.time()data=s.recv(buf_maxsize)data_len += len(data)if data_len == data_maxsize:    #收到所有数据breakif not data:    #对端关闭了套接字breakexcept Exception as e:print("{}".format(e))breakpassed_time = time.time() - begin_timepassed_time_ns = time.time_ns() - begin_time_nsprint(passed_time)print(passed_time_ns)print(data_len)print('speed: %.2fMB/s' % (data_len/1024/1024/passed_time))print('buffer size: %dB' % (buf_maxsize))print('total data len: %dB' % (data_len))print('Bandwidth: %.2fMbps' % (data_len/1024/1024/passed_time*8))print("close client socket")s.send(b'client close')s.close()break

相关文章:

【python】TCP测速程序

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

新书速览|从零开始大模型开发与微调:基于PyTorch与ChatGLM

详细讲解大模型基本理论、算法、程序实现与应用实战,揭示大模型开发与微调技术 1 本书内容 大模型是深度学习自然语言处理皇冠上的一颗明珠,也是当前AI和NLP研究与产业中最重要的方向之一。本书使用PyTorch 2.0作为学习大模型的基本框架,以C…...

边缘计算:连接实时数据的力量与未来发展之路

边缘计算是一种分布式计算范式,它旨在将数据处理、存储和应用服务带到数据源的近端,即网络的“边缘”。在边缘计算模型中,算力和存储资源距离末端用户或数据源更近,这减少了数据在网络中传输的距离,从而降低延迟&#…...

ZooKeeper 实战(四) Curator Watch事件监听

文章目录 ZooKeeper 实战(四) Curator Watch事件监听0.前言1.Watch 事件监听概念2.NodeCache2.1.全参构造器参数2.2.代码DEMO2.3.日志输出 3.PathChildrenCache3.1.全参构造器参数3.2.子节点监听时间类型3.2.代码DEMO 4.TreeCache4.1.构造器参数4.2.代码DEMO4.3.日志输出 ZooKe…...

Spring Boot 构建工具插件

本文为官方文档直译版本。原文链接 Spring Boot 构建工具插件 引言Spring Boot Maven PluginSpring Boot Gradle PluginSpring Boot AntLib 模块Spring Boot Ant 任务使用 "exejar" 任务示例 使用 "findmainclass" 任务例子 支持其它构建系统重新包装档案嵌…...

Java集成消息队列Kafka

1.Kafka maven坐标 在使用Maven构建Java项目时&#xff0c;你可以通过添加Kafka的Maven依赖来引入Kafka相关的库。下面是Kafka的Maven坐标&#xff1a; <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId&g…...

第十四章JSON

第十四章JSON 1.什么是JSON2.JSON的定义和访问3.JSON在JavaScript中两种常用的转换方式4.JavaBean和JSON的相互转换5.List集合和JSON的相互转换6.map集合和JSON的相互转换 1.什么是JSON 2.JSON的定义和访问 JSON的定义 JSON的类型是一个Object类型 JSON的访问 我们要…...

0_项目git地址——正点原子minifly与crazyflie

1、说明&#xff1a; 在每个专栏的第一篇文章&#xff0c;笔者都会贴出项目的git地址&#xff0c;方便后来者学习和复现&#xff1b; 下面介绍两个项目的官网资料和git地址&#xff0c;最后给出两者的对比&#xff1b; 2、正点原子minifly (1)minifly官网资料下载中心&#…...

php 字符串常用函数

目录 1.一些常用函数 2.代码示例 1.一些常用函数 函数名描述trim()删除字符串两端空行或其它预定义符rtrim()删除字符串右边空行或其它预定义符ltrim()删除字符串左边空行或其它预定义符dirname()返回路径中的目录部分str_split()把字符串分割到数组里explode()使用一个字符串…...

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)

Android基于Matrix绘制PaintDrawable设置BitmapShader&#xff0c;以手指触点为中心显示原图像圆图&#xff0c;Kotlin&#xff08;2&#xff09; 在 https://zhangphil.blog.csdn.net/article/details/135374279 基础上&#xff0c;增加一个功能&#xff0c;当手指在上面的图片…...

FlinkOnYarn 监控 flink任务

Flink任务一般为实时不断运行的任务&#xff0c;如果没有任务监控, 任务异常时无法第一时间处理会比较麻烦。 这里通过调用API接口方式来获取参数&#xff0c;实现任务监控。 Flink任务监控&#xff08;基于API接口编写shell脚本&#xff09; 一 flink-on-yarn 模式 二 编写she…...

C++内存管理机制(侯捷)笔记1

C内存管理机制&#xff08;侯捷&#xff09; 本文是学习笔记&#xff0c;仅供个人学习使用。如有侵权&#xff0c;请联系删除。 参考链接 Youtube: 侯捷-C内存管理机制 Github课程视频、PPT和源代码: https://github.com/ZachL1/Bilibili-plus 第一讲primitives的笔记 截至…...

【论文阅读】Non-blocking Lazy Schema Changes in Multi-Version

Non-blocking Lazy Schema Changes in Multi-Version Database Management Systems 1. Intro 1.1 Motivation 一个是online能够提供不停机的更新的能力&#xff0c;在很多业务系统里面是必要的。第二个是满足高可用&#xff0c;SaaS、PaaS要提供高可用的系统给用户&#xff…...

Rust 最新版1.75.0升级记

升级方法 稳定版 C:\>rustup update stable info: syncing channel updates for stable-x86_64-pc-windows-msvc info: latest update on 2023-12-28, rust version 1.75.0 (82e1608df 2023-12-21) info: downloading component cargo 5.9 MiB / 5.9 MiB (100 %) 3.…...

使用 KubeSphere 与极狐GitLab 打造云原生持续交付系统

极狐GitLab 简介 极狐GitLab 是一个一体化的 DevOps 平台&#xff0c;可以简单理解为 GitLab 在国内的“发行版”。是由极狐(GitLab)公司推出的产品&#xff08;极狐(GitLab)公司是以“中外合资3.0”模式成立的公司&#xff0c;在国内独立运营&#xff0c;为国内用户提供适合本…...

EasyExcel的追加写入(新增POI、CSV)

总结&#xff1a;目前市面上流行的2种 EasyExcel和POI都不是真正的对物理excel文件进行追加导入。只是在缓存里面追加&#xff0c;最后一次性写入&#xff0c;并不能解决内存占用问题。 1.EasyExcel2.POI3.CSV 无非就是下面两种逻辑&#xff1a; 1.for循环查询数据&#xff0c;…...

JetBrains 开发工具——免费教育许可申请流程

JetBrains 开发工具——免费教育许可申请流程 本文将详细介绍通过教育邮箱申请Free Educational Licenses. Free Educational Licenses地址 1.选择符合自己的申请入口 2.填写申请表单提交 官方指南 &#x1f603;&#x1f603;&#x1f603;...

打造高性价比小程序,轻松降低成本

随着移动互联网的普及&#xff0c;小程序已经成为一个热门的应用开发方向。然而&#xff0c;对于许多企业和个人而言&#xff0c;制作一个小程序的费用却让人望而却步。那么&#xff0c;如何以最低的成本制作一款高性价比的小程序呢&#xff1f; 答案很简单&#xff0c;只需要找…...

mysql 索引优化查询

MySQL的索引可以提高数据库查询性能。下面是一些常用的MySQL索引优化技巧&#xff1a; 创建合适的索引&#xff1a;根据查询条件选择合适的列作为索引&#xff0c;并确保这些索引在WHERE子句中被使用到。 示例代码&#xff1a;CREATE INDEX idx_name ON table_name (column_nam…...

跟着cherno手搓游戏引擎【4】窗口抽象、GLFW配置

引入GLFW&#xff1a; 在vendor里创建GLFW文件夹&#xff1a; 在github上下载&#xff0c;把包下载到GLFW包下。 GitHub - TheCherno/glfw: A multi-platform library for OpenGL, OpenGL ES, Vulkan, window and input修改SRC/premake5.lua的配置&#xff1a;12、13、15、36…...

GyverTimers:ATmega硬件定时器寄存器级精准控制

1. GyverTimers 库深度技术解析&#xff1a;面向 ATmega328P 与 ATmega2560 的硬件定时器全功能控制 GyverTimers 是一款专为 AVR 微控制器设计的轻量级、高精度硬件定时器控制库&#xff0c;其核心价值在于 绕过 Arduino 框架的抽象层&#xff0c;直接操作 ATmega 系列 MCU 的…...

皇后大学揭秘:AI机器人与人类程序员的代码审查大作战

当你写完一段代码&#xff0c;准备提交到项目中时&#xff0c;通常会有同事帮你检查一遍——这个过程叫做代码审查&#xff0c;就像文章发表前的编辑校对一样重要。不过现在情况有了变化&#xff1a;越来越多的AI机器人也开始参与代码审查工作&#xff0c;它们能自动发现bug、提…...

AI辅助开发新范式:让快马AI优化你的17.143.cv模型推理管线

AI辅助开发新范式&#xff1a;让快马AI优化你的17.143.cv模型推理管线 最近在做一个实时视频流人物动作识别的项目&#xff0c;用到了17.143.cv库中的姿态估计模型。开发过程中遇到了两个比较棘手的问题&#xff1a;一是模型在某些帧上的推理速度不够理想&#xff0c;影响了实…...

革新性图表创作:Mermaid Live Editor如何重构技术可视化工作流

革新性图表创作&#xff1a;Mermaid Live Editor如何重构技术可视化工作流 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-liv…...

Kimi-VL-A3B-Thinking效果展示:MMLongBench-Doc 35.1分超长文档理解

Kimi-VL-A3B-Thinking效果展示&#xff1a;MMLongBench-Doc 35.1分超长文档理解 1. 模型概述 Kimi-VL-A3B-Thinking是一款创新的开源混合专家&#xff08;MoE&#xff09;视觉语言模型&#xff0c;在多模态理解和长上下文处理方面展现出卓越能力。这个模型最引人注目的特点是…...

埃拉托斯特尼筛法(埃氏筛)完整解析

一、算法用途 快速找出 2 ~ n 之间的所有素数。 暴力判断每个数:O(nn​) 埃氏筛:O(nloglogn),接近线性,极快。 二、核心思想 先假设所有数都是素数。 从最小素数 2 开始,把它的所有倍数标记为合数。 取下一个没被标记的数(一定是素数),继续标记它的倍数。 最后没被标记…...

生成式AI系统“内容生成”合规:架构师如何避免“虚假信息”?附4个方法

生成式AI内容生成合规指南&#xff1a;架构师如何系统性规避虚假信息&#xff1f; 元数据框架 标题 生成式AI内容生成合规指南&#xff1a;架构师如何系统性规避虚假信息&#xff1f;——从理论到实践的4大核心策略 关键词 生成式AI合规, 虚假信息防范, 事实一致性, 架构设计, …...

writeup

3-hafuhafu - Writeup by AI 题目信息 项目内容平台BugKu类型Crypto (RSA)考点RSA 加密、大数分解、私钥计算 题目描述 题目给出了一个 RSA 公钥和一段 Base64 编码的密文&#xff0c;要求解密得到 flag。 公钥信息&#xff1a; pk (25572000680139535995611501720832880…...

Aria2磁力链接下载进阶技巧:多文件选择与限速设置详解

Aria2磁力链接下载进阶技巧&#xff1a;多文件选择与限速设置详解 在数字资源获取日益便捷的今天&#xff0c;高效下载工具成为技术爱好者和专业人士的必备利器。Aria2作为一款轻量级、多协议支持的命令行下载工具&#xff0c;凭借其强大的功能和灵活的配置选项&#xff0c;在L…...

如何用一套键鼠控制多台电脑?Lan Mouse跨平台键鼠共享终极指南

如何用一套键鼠控制多台电脑&#xff1f;Lan Mouse跨平台键鼠共享终极指南 【免费下载链接】lan-mouse mouse & keyboard sharing via LAN 项目地址: https://gitcode.com/gh_mirrors/la/lan-mouse 你是否经常需要在多台电脑之间切换工作&#xff1f;Windows台式机、…...