Rust时雄WebSocket echo服务器,flat_map流到多个消息中

dy1byipe  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在玩时雄WebSocket,我已经启动了from the echo example,并试图改变它。
我尝试做的是解析一个输入消息,从中提取一个数字,然后将相同的消息发送回客户机“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还很陌生,因为Error类型不是我所拥有的,我不知道如何解决这个问题,有没有其他的惯用方法来编写我正在尝试做的事情?

z5btuh9x

z5btuh9x1#

下面的例子使用了一个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();
            }
        }
    }

客户端外观

您可以查看完整的工作示例here

相关问题