Python 通过UDP传输超过64k的信息
Python 通过UDP传输超过64k的信息
在网络编程中,UDP(用户数据报协议)是一种常用的传输协议。与TCP不同,UDP是无连接的,并且不保证数据包的顺序、完整性及交付。尽管如此,UDP因其较低的延迟和开销而被广泛应用于实时通信和大规模数据传输的场景。
UDP消息大小限制
在UDP中,每个数据报的最大大小为65507字节。这一限制包括了UDP头(8字节)和IP头(20字节),因此用户实际可以传输的数据为65507 - 8 - 20 = 65507字节。为了通过UDP发送超过64KB的数据,我们需要将数据分割成多个较小的数据报进行传输。
数据分割与重组
为了发送超过64KB的信息,我们可以采取以下步骤:
- 将数据分割:把数据分成多个小于或等于64KB的部分。
- 发送数据:依次发送每个数据包。
- 接收数据:在接收端,将所有的数据包组合回原始数据。
下面是一个简单的示例,演示如何使用Python通过UDP传输超过64KB的信息。
示例代码
发送端
import socket
import osdef send_large_file(filename, ip, port):# 创建UDP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)# 获取文件大小filesize = os.path.getsize(filename)with open(filename, 'rb') as f:bytes_sent = 0while bytes_sent < filesize:# 读取最多65507字节的数据data = f.read(65507)sock.sendto(data, (ip, port))bytes_sent += len(data)print(f"Sent {bytes_sent} bytes")sock.close()if __name__ == "__main__":FILE_TO_SEND = "large_file.txt" # 替换为你要发送的文件路径DEST_IP = "127.0.0.1" # 替换为目标IP地址DEST_PORT = 12345 # 替换为目标端口send_large_file(FILE_TO_SEND, DEST_IP, DEST_PORT)
接收端
import socketdef receive_large_file(port):# 创建UDP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)sock.bind(('', port))with open("received_file.txt", 'wb') as f:while True:data, addr = sock.recvfrom(65507) # 接收数据if not data:breakf.write(data)print(f"Received {len(data)} bytes from {addr}")sock.close()if __name__ == "__main__":PORT = 12345 # 替换为接收端口print("Waiting for data...")receive_large_file(PORT)
测试说明
- 发送文件: 在发送端,脚本会读取指定的文件并以UDP数据包的形式逐块发送数据。
- 接收文件: 在接收端,脚本会监听指定的端口并接收数据,然后将接收到的数据写入到新文件中。
注意事项
- 在实际应用中,由于UDP不提供数据包的顺序保证,因此接收端可能需要实现一些机制来确认数据包的顺序和完整性。
- 可以考虑添加超时处理和重传机制,以提高数据传输的可靠性。
总结
通过以上示例,我们展示了如何使用Python通过UDP传输超过64KB的信息。虽然UDP在速度和效率上有优势,但在数据完整性和顺序方面存在一定的局限性。在设计基于UDP的应用时,需要根据具体需求权衡这些因素。
测试部分
要测试上面提供的UDP发送和接收程序,可以按照以下步骤进行操作:
步骤 1: 准备测试文件
首先,确保你有一个大于64KB的文件以供测试。如果没有,你可以创建一个简单的文本文件:
# 在Linux或Mac终端中创建一个100KB的文件
dd if=/dev/zero of=large_file.txt bs=1024 count=100
这条命令会生成一个名为 large_file.txt
的文件,大小为100KB。
步骤 2: 设置接收端
-
打开一个终端窗口(命令提示符)。
-
将上述接收端代码保存到一个Python文件中,比如命名为
udp_receiver.py
。 -
运行接收端脚本:
python udp_receiver.py
确保接收端在先启动,并且它正在监听指定的端口。
步骤 3: 设置发送端
-
打开另一个终端窗口。
-
将上述发送端代码保存到一个Python文件中,比如命名为
udp_sender.py
。 -
修改
udp_sender.py
中的FILE_TO_SEND
、DEST_IP
和DEST_PORT
变量,以匹配你的环境。默认情况下,您可以将DEST_IP
设置为127.0.0.1
(即本地IP) 并将DEST_PORT
设置为与接收端相同的端口。 -
运行发送端脚本:
python udp_sender.py
步骤 4: 验证接收到的文件
接收端运行后,它会开始接收数据并将其写入 received_file.txt
文件。完成发送后,你可以检查接收端的终端输出,确认接收到的字节数。
在接收端的工作目录中,你将找到一个名为 received_file.txt
的文件。通过以下命令检查文件大小:
ls -lh received_file.txt
你应该能够看到文件的大小与原始文件 (large_file.txt
) 相同。
注意事项
- 防火墙设置:确保你的防火墙没有阻止UDP端口的流量,在某些系统中可能需要手动允许。
- 网络配置:如果发送和接收程序不在同一台机器上,请确保网络配置正确,能互相通信。
- 错误处理:在实际应用中,如果发送或接收过程中出现错误(如超时),应添加适当的错误处理机制以提高可靠性。
通过以上步骤,你就可以成功测试UDP数据传输程序。
相关文章:
Python 通过UDP传输超过64k的信息
Python 通过UDP传输超过64k的信息 在网络编程中,UDP(用户数据报协议)是一种常用的传输协议。与TCP不同,UDP是无连接的,并且不保证数据包的顺序、完整性及交付。尽管如此,UDP因其较低的延迟和开销而被广泛应…...
微服务设计原则——高性能:批量
能批量就不要并发。 如果调用方需要调用我们接口多次才能进行一个完整的操作,那么这个接口设计就可能有问题。 比如获取数据的接口,如果仅仅提供getData(int id)接口,那么使用方如果要一次性获取 20 个数据,它就需要循环遍历调用…...

C:指针学习-指针变量—学习笔记
今日伊雷娜: 目录 前言: 1、字符指针变量 1.1 使用字符指针存放字符 1.2 使用字符指针变量存放字符串 2、数组指针变量 2.1 什么是数组指针变量? 2.2 数组指针变量初始化 2.3 关于数组指针类型的解析 3、函数指针变量 3.1 函数地址 …...

【MySQL 07】表的增删查改 (带思维导图)
文章目录 🌈 一、insert 添加数据⭐ 1. 单行数据 全列插入⭐ 2. 多行数据 指定列插入⭐ 3. 插入否则更新⭐4. 插入否则替换 🌈 二、select 查询数据⭐ 1. select 列🌙 1.1 全列查询🌙 1.2 指定列查询🌙 1.3 查询字段…...

快速上手Git
Git相关概念 Git是一个开源的分布式版本控制系统,由Linus Torvalds在2005年创建,用于有效、高速地处理从小到大的项目版本管理。它是由 Linux 之父 Linus Torvalds 开发的,并已经成为了现代软件开发领域中最流行的版本控制系统之一。 git的工…...

RTC时钟测试
1. 基础知识 Linux 的系统时间有时跟硬件时间是不同步的。 Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟。系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟,这个硬件时钟可以在BIO…...

大数据技术——实战项目:广告数仓(第六部分)报表数据导出至clickhouse
目录 第11章 报表数据导出 11.1 Clickhouse安装 11.2 Clickhouse建表 11.2.1 创建database 11.2.2 创建table 11.3 Hive数据导出至Clickhouse 第11章 报表数据导出 由于本项目最终要出的报表,要求具备交互功能,以及进行自助分析的能力,…...

Android studio模拟制作-简易的订餐交易小案例
一、最终呈现效果 订餐支付小案例效果 二、布局设计activity_main.xml <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xml…...

消防隐患在线小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,消防隐患举报管理,消防隐患分类管理,统计分类管理,处理结果管理,系统管理 微信端账号功能包括:系统首页,我…...

【Vue3】路由Params传参
【Vue3】路由Params传参 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗的日…...

授权cleanmymac访问全部磁盘 Mac授权访问权限 cleanmymac缺少权限
CleanMyMac是Mac系统下的一款专业的苹果电脑清理软件,同时也是一款优秀的电脑系统管理软件。它能有效清理系统垃圾,快速释放磁盘内存,缓解卡顿现象,保障系统顺畅地运行。 全磁盘访问权限,就好比机场内进行的安全检查。…...
Ubuntu/18.04 LTS下编译 BoringSSL 库
1、准备一个 Ubuntu/18.04 LTS 系统的设备 2、安装软件 GIT、GCC、CMAKE、G、Golang:1.16 及以上版本 3、克隆仓库源 git clone https://boringssl.googlesource.com/boringssl cd boringssl 4、使用特定版本 git checkout 9fc1c33e9c21439ce5f87855a6591a9324e569fd 5、编…...

【stm32项目】多功能智能家居室内灯光控制系统设计与实现(完整工程资料源码)
多功能智能家居室内灯光控制系统设计与实现 目录: 目录: 前言: 一、项目背景与目标 二、国内外研究现状: 2.1 国内研究现状: 2.2 国外研究现状: 2.3 发展趋势 三、硬件电路设计 3.1 总体概述 3.2 硬件连接总…...

xss靶场详解
目录 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 8.第八题 1.第一题 在源码script标签里边,innerhtml是用于访问或修改 HTML 元素内的 HTML 内容的,这里是访问spaghet这个元素的,并通过括号里面的东西搜索当前…...

华为的流程管理
华为建设流程体系始于2000年,那时华为公司面临着快速扩张和全球化发展的挑战,意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势,华为决定启动流程体系的建设。在建设过程中,华为借鉴了业界最佳…...
操作系统Linux
1.Linux命令 ls:查看当前目录下所有目录和文件ps:查看所有正在运行的进程top:显示当前系统中占用资源最多的一些进程,shiftm按照内存查看大小netstat:查看端口的命令vi:查看文件的命令rm:删除文…...

1、.Net UI框架:MAUI - .Net宣传系列文章
.NET MAUI(Multi-platform App UI)是一个跨平台的UI框架,它是.NET统一应用模型的一部分,允许开发者使用C#和.NET来创建适用于iOS、Android、macOS和Windows的应用程序。MAUI继承了Xamarin.Forms的一些概念,但提供了更多的原生平台集成和改进的…...
Spring boot 使用 jSerialComm 对串口使用发送信息并接收
什么是 jSerialComm? jSerialComm 是一个 Java 库,旨在提供一种独立于平台的方式来访问标准串行端口,而无需外部库、本机代码或任何其他工具。它旨在替代 RxTx 和(已弃用的)Java Communications API,具有更…...

江协科技STM32学习笔记(第10章 SPI通信)
第10章 SPI通信 10.1 SPI通信协议 10.1.1 SPI通信 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线; 串行外设接口; I2C无论是软件还是软件电路,设计的都还是比较复杂的,硬件…...
力扣热题100_回溯_22_括号生成
文章目录 题目链接解题思路解题代码 题目链接 22. 括号生成 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:[“((()))”,“(()())”,“(())()…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...