Rust 如何使用tokio tungstenite的send_all方法发送websocket消息流

Rust 如何使用tokio tungstenite的send_all方法发送websocket消息流,rust,Rust,我正在使用优秀的rust websocket库tokio tungstenite,它只是tokio版的tungstenite 我可以使用connect_async方法轻松连接到websocket流,在我得到的websocket流中,我将其拆分如下: connect_async(url).and_then(move |(ws_stream, _)| { let (sink, stream) = ws_stream.split(); pub fn iter_ok<I, E&

我正在使用优秀的rust websocket库tokio tungstenite,它只是tokio版的tungstenite

我可以使用connect_async方法轻松连接到websocket流,在我得到的websocket流中,我将其拆分如下:

connect_async(url).and_then(move |(ws_stream, _)| {

        let (sink, stream) = ws_stream.split();
pub fn iter_ok<I, E>(i: I) -> IterOk<<I as IntoIterator>::IntoIter, E> 
where
    I: IntoIterator, 
我可以使用如下发送消息轻松地将单个消息发送到接收器:

sink.send(tungstenite::Message::Text("my message".to_string()))
.map_err(|e| ())
.wait();
这只是一个人为的例子。我的问题是,我想通过接收器发送消息流,我知道使用send_all方法可以最好地实现这一点。我的尝试是:

let my_messsages : Vec<tungstenite::Message> = vec![
tungstenite::Message::Text("message_1".to_string()), 
tungstenite::Message::Text("message_2".to_string()) ];

let send_stream: tokio_tungstenite::WebSocketStream
<tokio_tungstenite::tungstenite::Message> 
= futures::stream::iter_ok(my_messages);

sink.send_all(stream).map_err(|e| ()).wait();
让我的消息:Vec=Vec![
tungstenite::Message::Text(“Message_1”。to_string()),
tungstenite::Message::Text(“Message_2.to_string())];
让我们发送流:tokio_tungstenite::WebSocketStream
=未来::流::iter_ok(我的_消息);
sink.send_all(stream).map_err(| e |()).wait();
但它不起作用,因为futures::stream::iter_ok不是构造我需要的流的正确方法,这正是我陷入困境的地方,我看不到如何从文档开始

编辑:最初我没有为send_流指定类型注释,它给了我以下错误:

type annotations needed for `futures::stream::iter_ok::IterOk
<std::vec::IntoIter<tungstenite::protocol::message::Message>, E>`

cannot infer type for `E`
'futures::stream::iter\u ok::IterOk所需的类型注释 ` 无法推断'E'的类型`
当前的错误也与发送流的类型批注有关。

您的问题完全在于这一行:

let send_stream:tokio_tungstenite::WebSocketStream
=未来::流::iter_ok(我的_消息);
其定义如下:

connect_async(url).and_then(move |(ws_stream, _)| {

        let (sink, stream) = ws_stream.split();
pub fn iter_ok<I, E>(i: I) -> IterOk<<I as IntoIterator>::IntoIter, E> 
where
    I: IntoIterator, 

应该能够完美地工作,正如您的接收器所期望的那样,这个新流将它作为一个元素(因为它是从一个
Vec
构建的)。
map\u err
纯粹是为了强制类型,在实践中永远不会调用

错误消息和MCVE一样非常有用。我发现了你的问题,但实际的错误/输出,而不是人工翻译,会节省我10分钟。@SébastienRenauld,我道歉。谢谢你的输入,我将相应地更新问题。谢谢你的输入。不幸的是,这不起作用,我会解释的。省略类型注释是我最初做的,它给了我这个错误:
futures::stream::iter\u ok::IterOk
所需的类型注释无法推断
E
的类型。我正在更新这个问题以包含这些信息,因为下面的内容不太可读。谢谢您的帮助。@jamespearson尝试使用
map\u err()
类型强制。显然,您需要有可用的
钨铅矿
。这纯粹是为了得到要解析的类型。这样做会将类型注释错误转移到map\u err,表示map\u err的“\u”下划线闭包参数需要一个类型。@jamespearson对此感到惊讶,但还好。
iter_ok()
的错误类型是
()
,因为它不能失败。编辑后的代码段,[Playway]似乎同意。@塞巴斯蒂安:谢谢你破解了它,我接受了你的答案。出于某种原因,这样发送会导致我正在讲话的websocket服务器发送一个关闭连接的关闭响应(可能是由于发送关闭了接收器)。你知道解决这个问题的方法吗?