我正在玩 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 很陌生,错误类型不属于我,我不知道如何解决这个问题
是否有一些不同的惯用方式来写我想做的事情?
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();
}
}
}
客户端的外观
您可以在