HFQR / xitca-web

Apache License 2.0
654 stars 41 forks source link

[求助]websocket怎么在任意上下文使用呢? #1034

Closed putao520 closed 1 month ago

putao520 commented 1 month ago

您好,现在的WebSocket没有clone,然后msg_sender方法返回的也是引用,请问那怎么实现获得一个sender实例从而实现在任意上下文向客户端发送信息呀?

fakeshadow commented 1 month ago

没有Clone是为了减低误使用消息发送端的可能性,常见于客户端已关闭连接而服务端仍发送消息的情况(或者多个服务端线程/任务竞争)。如果你需要绕过所有权的限制可以使用ResponseWeakSender,例如:

async fn handler(mut ws: WebSocket) -> WebSocket {
    // 获取消息发送端的弱指针
    let tx = ws.msg_sender().downgrade();

   // 弱指针有static生命周期可以跨线程/异步任务使用
    tokio::spawn(async {
       // 弱指针升级成功后可以发送消息
        while let Some(_tx) = tx.upgrade() {
            tokio::time::sleep(std::time::Duration::from_secs(1)).await;
        }
       // 升级失败表示连接已断开
    });

   // 其他代码 

    ws
}
putao520 commented 1 month ago

谢谢大佬,这样可以了!