首页 > 编程语言 >Python 通过UDP传输超过64k的信息

Python 通过UDP传输超过64k的信息

时间:2024-08-15 21:53:45浏览次数:13  
标签:__ UDP socket Python 64k sock large data size

在UDP中,单个数据包的最大尺寸通常受到网络层的限制,这通常被称为最大传输单元(MTU)。在以太网环境中,标准的MTU大小通常为1500字节。尽管有些网络环境可能支持更大的数据包,但是UDP数据包的理论最大限制是65535字节(64KB),这是由于UDP头部的16位长度字段决定的。

然而,如果你需要发送超过这个限制的数据,你必须将数据分割成多个较小的数据包,并在接收端重新组装它们。下面是一个Python示例,展示了如何通过UDP发送和接收超过64KB的数据。

服务器端(接收端)代码

import socket  
  
def receive_large_data(sock, expected_size):  
    data = b''  
    while len(data) < expected_size:  
        remaining = expected_size - len(data)  
        packet = sock.recv(min(remaining, 4096))  # 使用较小的缓冲区大小以模拟实际情况  
        if not packet:  
            raise Exception("Connection closed by remote host")  
        data += packet  
    return data  
  
def start_server():  
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
    server_sock.bind(('localhost', 12345))  
  
    while True:  
        data, addr = server_sock.recvfrom(1024)  # 接收数据包,包含数据大小和实际数据的第一部分  
        total_size = int(data.decode())  
        print(f"Expecting {total_size} bytes of data from {addr}")  
  
        large_data = receive_large_data(server_sock, total_size)  
        print(f"Received {len(large_data)} bytes of data from {addr}")  
  
        # 处理数据...  
        # 例如,可以将其写入文件或进行其他处理  
  
if __name__ == "__main__":  
    start_server()

客户端(发送端)代码

import socket  
  
def send_large_data(sock, data):  
    # 首先发送数据的大小,以便服务器知道要接收多少数据  
    sock.sendto(str(len(data)).encode(), ('localhost', 12345))  
  
    # 然后将数据分成小块并发送  
    chunk_size = 4096  # 可以根据需要调整这个大小  
    for i in range(0, len(data), chunk_size):  
        sock.sendto(data[i:i+chunk_size], ('localhost', 12345))  
  
def start_client():  
    client_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  
  
    # 创建一个大于64KB的数据包作为示例  
    large_data = b'x' * 70000  # 70,000 字节的数据  
  
    send_large_data(client_sock, large_data)  
  
if __name__ == "__main__":  
    start_client()

注意

  1. 这个示例仅用于教学目的,并没有处理所有可能的错误情况。在生产环境中使用时,请确保添加适当的错误处理和重试逻辑。
  2. 这个示例使用了本地回环地址(localhost)和端口号12345。在实际应用中,请根据需要修改这些值。
  3. 在实际应用中,可能还需要考虑数据的加密、压缩和校验等问题,以确保数据的完整性和安全性。

标签:__,UDP,socket,Python,64k,sock,large,data,size
From: https://www.cnblogs.com/TS86/p/18361870

相关文章

  • Python - Foundational Design Principles
    EncapsulateWhatVariesOneofthemostcommonchallengesinsoftwaredevelopmentisdealingwithchange.Requirements evolve,technologiesadvance,anduserneedsalsochange.Therefore,itiscrucialtowritecodethat canadaptwithoutcausingaripple......
  • 使用 Flask、Celery 和 Python 实现每月定时任务
    为了创建一个使用Flask、Celery和Python实现的每月定时任务,我们需要按照以下步骤进行:1.安装必要的库我们需要安装Flask、Celery和Redis(作为消息代理)。我们可以使用pip来安装它们:bash复制代码​pipinstallflaskceleryredis2.设置Flask和Celery首先,我们需......
  • Python数据分析项目实战01_票房榜单分析和pyecharts大屏可视化
    一:最终大屏效果展示由于生成了html网页只能在本地上显示,这个大屏是动态的,只能显示其中的图片。如果要分享给他人使用,就需要将html源码转为网页。生成的html源码入口:‬​‍​‌‌​⁠​​​‌‍​​​​​‬​​​​​‬​​​​‌​​​‌‍​​​​​⁠‌‬‌​​‌Python数......
  • Levenshtein,一个超实用的Python库
    Levenshtein距离,又称编辑距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。在Python中,Levenshtein库提供了计算Levenshtein距离和相关度量的高效算法。Levenshtein的功能特性高效性:Levenshtein算法在计算字符串距离时具有较高效率。灵活性:支持自定义替换、......
  • awesome-django,一个超酷的Python库
    awesome-django是一个开源的Django扩展库,汇集了众多实用的第三方Django插件和工具,旨在帮助开发者快速构建高质量、功能丰富的Django应用程序。通过awesome-django,开发者可以轻松集成常用的功能,提升开发效率。如何安装awesome-django首先,确保你已经安装了最新版本......
  • cryptography,是一个强大的 Python 库
    cryptography是一个强大的Python库,提供了加密、解密、签名、验证等一系列安全功能,帮助开发者轻松实现数据安全。该库适用于各种加密需求,从简单的数据加密到复杂的网络安全通信。cryptography的功能特性安全性:提供多种加密算法,确保数据安全。灵活性:支持多种加密协议和标......
  • 盘点一个Python图像读取的小问题
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【Wayne.Wu】问了一个Python图像读取的问题,这里拿出来给大家分享下。一看文字这么多,感觉还是挺复杂的,都有点让人头大的感觉。二、实现过程经过提示,粉丝自己明白了,先进行本地保存,之后再读取,就可以搞定了。顺利地解决......
  • 云计算实训30——mysql主从复制同步、mysql5.7版本安装配置、python操作mysql数据库、
    一、mysql主从复制及同步1、mysql主从自动开机同步2、配置mysql5.7版本mysql-5.7.44-linux-glibc2.12-x86_64.tar启动服务、登录对数据库进行基本操作3、使用python操纵mysql数据库4、编辑python脚本自动化操纵mysql数据库二、mycat读写分离......
  • Python实现最长回文字符串
    题目最长回文字符串是一种对称的字符串,如s="ababd",其中"aba"或"bab"都是回文字符串。求解思路最开始的思路是用类似括号匹配的放手,利用栈来做“对对消”,来判断一个字符串是不是回文字符串,但实际操作中发现“对称轴”元素是不确定的,前面的消除会导致后面的无法对比。然后......
  • Python yield和yield from关键字
    在Python中,yield和yieldfrom是两个与生成器(generator)紧密相关的关键字,它们允许函数以迭代的方式逐个返回结果,而不是一次性返回所有结果。这种方式在处理大量数据或需要惰性计算时非常有用,因为它可以节省内存并提高效率。yieldyield关键字用于从函数中返回一个值,并保留函......