Rust tokio websocket echo server, flat_map stream into multiple messages

问题描述 投票:0回答:1

我正在玩 tokio websocket,我已经从 echo 示例开始并尝试更改它。 我想做的是解析输入消息,从中提取数字并将相同的消息发送回客户端“n”次。

到目前为止我所做的是:

let (mut write, read) = ws_stream.split(); // We should not forward messages other than text or binary. read.try_filter(|msg| future::ready(msg.is_text() || msg.is_binary())) .flat_map(|msg| { let msg = msg.and_then(Message::into_text); let times = msg.map(|v| extract(v.as_str())) .unwrap_or(0); let txt = msg.unwrap_or("Error".into()); repeat(Ok(Message::Text(txt))) .take(times) }) .forward(write) .await .expect("Failed to forward messages");
但是我得到了错误:

error[E0277]: the trait bound `tokio_tungstenite::tungstenite::Error: Clone` is not satisfied --> src/main.rs:42:10 | 42 | .flat_map(|msg| { | ^^^^^^^^ the trait `Clone` is not implemented for `tokio_tungstenite::tungstenite::Error
我对 Rust 很陌生,错误类型不属于我,我不知道如何解决这个问题
是否有一些不同的惯用方式来写我想做的事情?

rust websocket stream rust-tokio
1个回答
0
投票
下面的例子使用了

for循环发送多条消息,如果你发现更好的方法欢迎打开PR

while let Some(Ok(msg)) = read.next().await { if msg.is_text() { let text = msg.to_text().unwrap(); let re = Regex::new(r"(\d+)").unwrap(); if let Some(captures) = re.captures(text) { if let Ok(n) = captures[1].parse::<usize>() { for _i in 0..n { write.send(Message::text(text)).await.unwrap(); } } } else { println!("{text}"); write.send(Message::Text("Invalid message:".to_string())).await.unwrap(); } } }
客户端的外观

您可以在

这里看到完整的工作示例

© www.soinside.com 2019 - 2024. All rights reserved.