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

被折叠的 条评论
为什么被折叠?



