Rust websocket 客户端实现[转]

文章讲述了在Rust中利用Websockets库和Tokio运行时建立WebSocket连接,并通过线程和异步操作定期发送ping来维持长连接的过程。遇到的问题包括闭包在循环中的使用以及如何有效管理WebSocket的读写操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目前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);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zeloas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值