Python: 通过 UDP 发送大对象

Python: Sending large object over UDP

我是套接字编程的新手,最近学习了 Python。我有几个问题,似乎找不到明确的答案。

我正在研究通过 UDP 发送数据,并且已经编写了一个简单的 python 脚本来实现这一点。可以很好地发送小对象(准确地说是小的腌制对象),但是我应该如何处理太大而无法放入一个 UDP 数据包中的对象?

我想到了首先以字节为单位确定对象的大小。如果对象小到足以放入 UDP 数据包,则什么都不做,但如果对象太大,则对象将被均匀地(如果可能)分割成许多较小的块,以便它可以放入多个UDP 数据包并发送到客户端。一旦客户端收到数据块,客户端会将多个UDP数据包重新组装成原始状态。

在尝试实施上述内容时,我立即遇到了第一堵墙。

根据我的研究,似乎没有任何 'effective' 方法可以获取对象的字节大小。这意味着我无法确定对象是否太大而无法放入 UDP 数据包。

如果我坚持要将大对象发送给客户端,会发生什么情况?它会自动分片并在客户端重新组装还是会被客户端丢弃?

通过 UDP 处理大对象的正确方法是什么?请记住,大对象可以是大小为 1GB 的文件或大小为 25MB 的字节对象。

提前致谢。

旁注:

大多数处理套接字的应用程序可能会将数据存储在内存中,直到数据全部发送完毕。馊主意!我有一个产品应用程序必须通过网络发送非常大的文件并且过去使用过分块方法。我只是在 Python ( binfileio ) 中重写了一些代码。在我的应用程序中,我将 chuck 文件发送到一个保留的文件夹,一旦所有分块文件都被塞进床,我就重新组合它们。我从不相信通过可能随时被切断的线路发送大文件。希望这有帮助。

一个UDP数据包最大可达64k左右。所以如果你想发送一个比这个大的文件,你可以将自己分成 64k 的数据包。那是理论上的最大值。我的建议是使用 500 字节的较小块的片段。

如果您使用 64k 数据包,IP 负责数据包的分段和重组。 500 字节的较小数据包不太可能被分段,因为 mtu 通常约为 1500 字节。如果您使用较大的分段数据包,如果其中一个分段丢失,IP 将丢弃它们。

你是对的,使用 TCP 可能更适合用于类似这样的事情,甚至是像 TFTP 这样的现有协议。它像您一样实现了每个数据包的确认机制和序列号。

Pytho 3.0

UDP通信发送数据代码

import socket
UDP_IP = "127.0.0.1"
UDP_PORT = 5005
MESSAGE = "Hello, World!"
print("UDP target IP:",UDP_IP)
print("UDP target port:",UDP_PORT)
print("message:",MESSAGE)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
sock.sendto(bytes(MESSAGE, "utf-8"), (UDP_IP, UDP_PORT))