Rust websocket 客户端实现

本文档展示了如何在Rust中使用websockets库建立WebSocket连接,并通过Tokio运行时实现心跳机制以维持长连接。代码示例中,创建了一个线程周期性发送'ping'消息以防止连接中断,同时不断接收并打印接收到的数据。

Rust websocket 客户端实现

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值