Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:通过UDP发送大型对象_Python_Sockets_Networking_Udp - Fatal编程技术网

Python:通过UDP发送大型对象

Python:通过UDP发送大型对象,python,sockets,networking,udp,Python,Sockets,Networking,Udp,我是套接字编程新手,最近学习了Python。我脑子里有几个问题,似乎找不到确切的答案 我正在研究通过UDP发送数据,并编写了一个简单的python脚本来实现这一点。通过发送小对象(确切地说是小的pickle对象)可以很好地工作,但是我应该如何处理那些太大而无法装入一个UDP数据包的对象呢 我考虑过首先以字节为单位调整对象的大小。如果对象小到足以装入UDP数据包,则不会执行任何操作,但如果对象太大,则会将对象均匀地(如果可能)拆分为许多较小的块,以便将其装入多个UDP数据包并发送到客户端。一旦客户

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

我正在研究通过UDP发送数据,并编写了一个简单的python脚本来实现这一点。通过发送小对象(确切地说是小的pickle对象)可以很好地工作,但是我应该如何处理那些太大而无法装入一个UDP数据包的对象呢

我考虑过首先以字节为单位调整对象的大小。如果对象小到足以装入UDP数据包,则不会执行任何操作,但如果对象太大,则会将对象均匀地(如果可能)拆分为许多较小的块,以便将其装入多个UDP数据包并发送到客户端。一旦客户端接收到数据块,客户端就会将多个UDP数据包重新组合到原始状态

当我试图实现上面提到的方法时,我立即遇到了我的第一道障碍

根据我所做的研究,似乎没有任何“有效”的方法来获取对象的字节大小。这意味着我无法确定对象是否太大,无法放入UDP数据包

如果我坚持向客户发送一个大对象,会发生什么?它会自动碎片化并在客户端重新组装,还是会被客户端丢弃

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

提前谢谢

旁注:

  • 我理解UDP数据包可能并不总是按顺序和顺序出现 所以我已经为它实施了对策,这是 为发送到客户端的UDP数据包标记序列号

  • 我确实理解,无法保证客户端将接收所有UDP数据包。我现在不担心数据包丢失

  • 我知道TCP是我正在尝试做的事情的合适的候选者,但我将重点放在理解UDP以及如何处理目前无法确认来自客户端的数据包的情况

  • 我知道泡菜的使用是不安全的。我们将在稍后阶段进行研究


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

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

如果您使用64k数据包,IP负责数据包的碎片化和重新组装。500字节的较小数据包不太可能被分割,因为mtu通常在1500字节左右。如果您使用的是碎片化的较大数据包,如果其中一个碎片丢失,IP将丢弃这些数据包


您是对的,使用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))