我正在尝试使用async_std
从网络接收UDP数据报。
有一个UdpSocket
实现了async recv_from
,这个方法返回一个future,但是我需要一个async_std::stream::Stream
,它给出了一个UDP数据报流,因为它是一个更好的抽象。
我发现tokio::net::UdpFramed
正好满足了我的需求,但它在当前版本的时雄中不可用。
一般来说,问题是如何将Future
s从给定的异步函数转换为Stream
?
我正在尝试使用async_std
从网络接收UDP数据报。
有一个UdpSocket
实现了async recv_from
,这个方法返回一个future,但是我需要一个async_std::stream::Stream
,它给出了一个UDP数据报流,因为它是一个更好的抽象。
我发现tokio::net::UdpFramed
正好满足了我的需求,但它在当前版本的时雄中不可用。
一般来说,问题是如何将Future
s从给定的异步函数转换为Stream
?
2条答案
按热度按时间2wnc66cl1#
对于单个项目,请使用
FutureExt::into_stream
:对于闭包生成的来自多个future的流,使用
stream::unfold
:在您的情况下,可以使用
stream::unfold
:6tr1vspr2#
一般来说,问题是如何将
Futures
从给定的异步函数转换为Stream
?有
FutureExt::into_stream
,但是不要被这个名字欺骗了;它不太适合你情况。有一个
UdpSocket
实现了异步recv_from
,这个方法返回一个future,但是我需要一个async_std::stream::Stream
,它给出了一个UDP数据报流,因为它是一个更好的抽象。在这里,它 * 不 * 一定是一个更好的抽象。
具体来说,
async-std
的UdpSocket::recv_from
返回一个future,其输出类型为(usize, SocketAddr)
--接收到的数据的大小和对等地址,如果你使用into_stream
将其转换为流,它只会给予你这个,而不是接收到的数据。我发现
tokio::net::UdpFramed
正是我所需要的,但它在当前版本的时雄中不可用。它已经被移到
tokio-util
的板条箱中了。不幸的是,你也不能(轻松地)使用它。它需要一个tokio::net::UdpSocket
,这和async_std::net::UdpSocket
不一样。当然,您可以使用future实用程序函数(如
futures::stream::poll_fn
或futures::stream::unfold
)为UdpSocket::recv_from
提供futures::stream::Stream
外观,但是接下来您将如何处理它呢?如果您最终调用StreamExt::next
以从其中轮询一个值,则可以直接使用recv_from
。只有当您正在使用的某些API需要
Stream
输入时,才需要达到Stream
,例如rusoto
: