我想将数据(大小大于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)
。感谢您的帮助。
答案 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则只能丢弃。)