Rust websocket 客户端实现

180it 2023-03-03 AM 471℃ 0条

目前rust websocket文档较少,最近为了实现部分工作需要使用rust去做websocket链接网上找了不少,很多没有太多参考价值,websocket 在rust中要保持长连接,期间需要不停的去ping,不然会中断,但是使用线程在常规情况下闭包又无法在循环数据的时候持续的ping,所以引入了一下第三方包。

Cargo.toml

[dependencies]
tokio = { version = "1.19.2", features = ["rt", "rt-multi-thread", "macros"] }
websockets= "0.3.0"
futures = "0.3.21"

main.rs

use std::thread;
use std::time::Duration;
use websockets::{WebSocket, WebSocketWriteHalf};

#[tokio::main]
async fn main() {
    // 建立websocket连接
    let mut ws = WebSocket::connect("wss://xxxxxxx").await.unwrap();
    
    let (mut r, mut w) = ws.split();
    let send_str = "你想提交的内容";
    w.send_text(send_str.to_string()).await.unwrap();
    
    // 定期推送ping,如果想改这里自己建立信息通讯mpsc::channel(0) 发送不同的数据;
    thread::spawn(move || {
        loop {
            // 这里因为是async自己包裹一下不然跑步起来
            tokio::runtime::Builder::new_multi_thread()
                .enable_all()
                .build()
                .unwrap()
                .block_on(async {
                    // 睡眠定期推送数据
                    thread::sleep(Duration::new(20, 0));
                    w.send_text("ping".parse().unwrap()).await.unwrap();
                });
        }
    });
    
    // 循环打印数据
    loop {
        let s = r.receive().await.unwrap();
        let (ss, b, snake_case) = s.as_text().unwrap();
        println!("Got:{}", ss);
    }
}

————————————————

原文链接:https://blog.csdn.net/theGrass_/article/details/125321274

支付宝打赏支付宝打赏 微信打赏微信打赏

如果文章或资源对您有帮助,欢迎打赏作者。一路走来,感谢有您!

标签: none

Rust websocket 客户端实现