Python:通过UDP发送大型对象
我是套接字编程新手,最近学习了Python。我脑子里有几个问题,似乎找不到确切的答案 我正在研究通过UDP发送数据,并编写了一个简单的python脚本来实现这一点。通过发送小对象(确切地说是小的pickle对象)可以很好地工作,但是我应该如何处理那些太大而无法装入一个UDP数据包的对象呢 我考虑过首先以字节为单位调整对象的大小。如果对象小到足以装入UDP数据包,则不会执行任何操作,但如果对象太大,则会将对象均匀地(如果可能)拆分为许多较小的块,以便将其装入多个UDP数据包并发送到客户端。一旦客户端接收到数据块,客户端就会将多个UDP数据包重新组合到原始状态 当我试图实现上面提到的方法时,我立即遇到了我的第一道障碍 根据我所做的研究,似乎没有任何“有效”的方法来获取对象的字节大小。这意味着我无法确定对象是否太大,无法放入UDP数据包 如果我坚持向客户发送一个大对象,会发生什么?它会自动碎片化并在客户端重新组装,还是会被客户端丢弃 通过UDP处理大型对象的正确方法是什么?请记住,大对象可以是1GB大小的文件,也可以是25MB大小的字节对象 提前谢谢 旁注:Python:通过UDP发送大型对象,python,sockets,networking,udp,Python,Sockets,Networking,Udp,我是套接字编程新手,最近学习了Python。我脑子里有几个问题,似乎找不到确切的答案 我正在研究通过UDP发送数据,并编写了一个简单的python脚本来实现这一点。通过发送小对象(确切地说是小的pickle对象)可以很好地工作,但是我应该如何处理那些太大而无法装入一个UDP数据包的对象呢 我考虑过首先以字节为单位调整对象的大小。如果对象小到足以装入UDP数据包,则不会执行任何操作,但如果对象太大,则会将对象均匀地(如果可能)拆分为许多较小的块,以便将其装入多个UDP数据包并发送到客户端。一旦客户
- 我理解UDP数据包可能并不总是按顺序和顺序出现 所以我已经为它实施了对策,这是 为发送到客户端的UDP数据包标记序列号
- 我确实理解,无法保证客户端将接收所有UDP数据包。我现在不担心数据包丢失
- 我知道TCP是我正在尝试做的事情的合适的候选者,但我将重点放在理解UDP以及如何处理目前无法确认来自客户端的数据包的情况
- 我知道泡菜的使用是不安全的。我们将在稍后阶段进行研究
您是对的,使用TCP可能更好地用于像这样的东西,甚至是像TFTP这样的现有协议。它实现了每个数据包的确认机制和序列号,就像您所做的那样。pytho3.0 通过UDP通信发送数据的代码
伟大的我将把它作为发送大型文件的起点。非常感谢。谢谢你的清楚解释。我知道,如果文件太大,可以手动将其分解为块,但是对于大于500字节的字节或pickle对象,或者对于达到这种大小的python对象,这是不太可能的?另外,鉴于sys.getsizeof非常无用,您如何知道您试图发送的python对象的大小超过了500字节。如果您传输的是一个文件,那么python中肯定有方法获取文件大小并以块形式读取。不幸的是,它不是一个文件。我有这样的想法,在将数据发送到另一个客户端之前,我有一个存储连续UDP数据包(例如,每5个数据包)数据的数组。可能有时阵列会变得太大。不确定这个想法是否可行。这与原来的帖子有关吗?
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))