如何将UDP与Asyncio一起用于从服务器到客户端的多个文件传输-python

时间:2018-12-11 22:13:45

标签: python python-3.x multithreading python-asyncio

我想将数据(大小大于3 MB的多个图像)从服务器传输到客户端。由于我想测试不重新传输的丢包情况,因此我不想使用流(TCP)。

我经历了这个example。我的方法是,服务器使用f.read(1024)读取数据块,然后使用transport.sendto(data + seq_num)发送给客户端。读取和发送将一直循环直到文件结束。  客户端将通过datagram_received(self, data, addr):进行接收。由于我沿着数据发送了序列号( seq_num ),因此我可以控制丢失的段和顺序。我的问题是在客户端接收和写入数据。如何使用datagram_received (self, data, addr)功能在某些条件下在客户端存储从服务器在不同时间发送的数据?

是否有用于从袜子接收数据到buf缓冲区的功能?例如用于流(TCP)data = await loop.sock_recv(tcp_sock, buf)。感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

  

是否有用于从袜子接收数据到buf缓冲区的功能?例如,用于流(TCP)data = await loop.sock_recv(tcp_sock, buf)

正如评论中指出的那样,数据报不能提供真正的流接口,因为UDP不保证传递顺序。如果我对问题的理解正确,那么您希望在下一个UDP数据包传递时使用 awaitable 接口,因为默认情况下提供的接口完全基于回调。

幸运的是,将基于回调的接口转换为可等待的接口非常容易-asyncio通常为此目的使用Future,其中协程等待未来,而回调调用{{1 }}将数据传递给等待的协程-请参阅文档sample UDP client中的set_result()

良好的类似流的API始终支持某种形式的缓冲,这可由容量有限的队列提供:

on_con_lost

有限大小的队列允许数据处理暂时慢于数据到达的速度,同时在情况继续发生的情况下防止内存泄漏。队列填满后,数据包将被丢弃。 (在使用TCP / IP支持的流的情况下,我们会减慢读取速度以提供反压-在this article中已作了很好的解释,但使用UDP则只能丢弃。)