Rust 将未来连接拆分为接收器和流,并在两个不同的任务中使用它们

Rust 将未来连接拆分为接收器和流,并在两个不同的任务中使用它们,rust,Rust,我正在使用websocket库试验FuturesAPI。我有以下代码: use futures::future::Future; use futures::future; use futures::sink::Sink; use futures::stream::Stream; use futures::sync::mpsc::channel; use futures::sync::mpsc::{Sender, Receiver}; use tokio_core::reactor::Core;

我正在使用
websocket
库试验FuturesAPI。我有以下代码:

use futures::future::Future;
use futures::future;
use futures::sink::Sink;
use futures::stream::Stream;
use futures::sync::mpsc::channel;
use futures::sync::mpsc::{Sender, Receiver};
use tokio_core::reactor::Core;

use websocket::{ClientBuilder, OwnedMessage};

pub fn main() {
    let mut core = Core::new().unwrap();
    let handle = core.handle();

    let handle_clone = handle.clone();

    let (send, recv): (Sender<String>, Receiver<String>) = channel(100);

    let f = ClientBuilder::new("wss://...")
        .unwrap()
        .async_connect(None, &handle_clone)
        .map_err(|e| println!("error: {:?}", e))

        .map(|(duplex, _)| duplex.split())
        .and_then(move |(sink, stream)| {

            // this task consumes the channel, writes messages to the websocket
            handle_clone.spawn(future::loop_fn(recv, |recv: Receiver<String>| {
                sink.send(OwnedMessage::Close(None))
                    .and_then(|_| future::ok(future::Loop::Break(())))
                    .map_err(|_| ())
            }));

            // the main tasks listens the socket
            future::loop_fn(stream, |stream| {
                stream
                    .into_future()
                    .and_then(|_| future::ok(future::Loop::Break(())))
                    .map_err(|_| ())
            })
        });

    loop {
        core.turn(None)
    }
}
我可以直接使用双工发送和接收,但这会导致更严重的错误

你有什么想法可以让它工作吗?事实上,我很乐意使用任何
futures
代码,这些代码允许我无阻塞地连接到服务器并生成两个异步任务:

  • 从连接中读取数据并执行某些操作(打印到屏幕等)的程序
  • 一种从mpsc通道读取数据并写入连接的设备
如果我必须以不同的风格编写它,那也没关系。

实现了定义
发送
以获取所有权的功能:

fn send(self, item: Self::SinkItem) -> Send<Self>
where
    Self: Sized,
在实施过程中突出的要点是:

  • 一切最终都必须成为未来
  • 定义错误类型并将其转换为错误类型更容易
  • 知道
    错误
    相关类型是否“正确”是一件棘手的事情。我最后做了很多“类型断言”(
    {let x:&Future=&reader;}
  • 实现定义
    发送
    以获取所有权:

    fn send(self, item: Self::SinkItem) -> Send<Self>
    where
        Self: Sized,
    
    在实施过程中突出的要点是:

  • 一切最终都必须成为未来
  • 定义错误类型并将其转换为错误类型更容易
  • 知道
    错误
    相关类型是否“正确”是一件棘手的事情。我最后做了很多“类型断言”(
    {let x:&Future=&reader;}

  • 这是。这是。谢谢,我会在12小时内尝试,并告诉你它是否有效。顺便说一句,你的接收器不再返回
    字符串。在原始代码中,接收方返回了一个
    字符串
    @sinan yes,它不需要获取
    字符串
    ,因为发送方只需构造一个
    OwnedMessage
    ,并将其直接放入通道。这样,您可以发送5种可能的消息类型中的任何一种。谢谢,我将在12小时内尝试此方法,并让您知道它是否有效。顺便说一句,您的接收器不再返回
    字符串。在原始代码中,接收方返回了一个
    字符串
    @sinan yes,它不需要获取
    字符串
    ,因为发送方只需构造一个
    OwnedMessage
    ,并将其直接放入通道。这样,您可以发送5种可能的消息类型中的任意一种。