Rust WebSocket库:Tokio-tungstenite 和 async-tungstenite
在现代Web开发中,WebSocket协议已成为创建实时应用的标准:聊天室、在线游戏、金融行情和通知系统。Rust生态系统提供了强大且安全的WebSocket工具,其中突出的是tokio-tungstenite和async-tungstenite。这些库基于流行的异步运行时Tokio和高性能WebSocket栈tungstenite构建。
什么是Tokio-tungstenite和async-tungstenite?
Tokio-tungstenite是一个与Tokio运行时集成的Rust异步WebSocket库。它提供了方便的抽象,用于创建WebSocket服务器和客户端,使用标准的Tokio类型(TcpListener,TcpStream)。
Async-tungstenite是一个更通用的版本,通过AsyncRead和AsyncWrite trait与任何异步运行时(Tokio、async-std、smol)配合使用。两个库都完全支持RFC 6455,包括消息分片、ping/pong和掩码处理。
主要功能
- 异步 — 使用
async/await的非阻塞操作 - 高性能 — 通过零拷贝解析实现最小开销
- 类型安全 — 消息表示为强类型结构
- 灵活性 — 同时支持服务器端和客户端
- SSL/TLS — 通过
rustls或native-tls内置支持安全连接 - 自动连接管理 — 处理断开和重连
安装
在Cargo.toml中添加:
[dependencies]tokio = { version = "1", features = ["full"] }tokio-tungstenite = "0.21"futures-util = "0.3"示例:WebSocket服务器
创建一个简单的回声服务器,将接收到的消息发送回去:
use tokio::net::TcpListener;use tokio_tungstenite::accept_async;use futures_util::{SinkExt, StreamExt};use std::error::Error;
#[tokio::main]async fn main() -> Result<(), Box> { let listener = TcpListener::bind("127.0.0.1:8080").await?; println!("WebSocket服务器已启动于 ws://127.0.0.1:8080");
while let Ok((stream, addr)) = listener.accept().await { println!("新连接:{}", addr); tokio::spawn(handle_connection(stream)); } Ok(())}
async fn handle_connection(stream: tokio::net::TcpStream) { let ws_stream = accept_async(stream).await.expect("握手失败"); let (mut write, mut read) = ws_stream.split();
while let Some(Ok(msg)) = read.next().await { if msg.is_text() || msg.is_binary() { // 将消息发送回去 if let Err(e) = write.send(msg).await { eprintln!("发送错误:{}", e); break; } } } println!("连接已关闭");} 示例:WebSocket客户端
连接到服务器并发送问候消息:
use tokio_tungstenite::connect_async;use futures_util::{SinkExt, StreamExt};use url::Url;
#[tokio::main]async fn main() -> Result<(), Box> { let url = Url::parse("ws://127.0.0.1:8080")?; let (ws_stream, _) = connect_async(url).await?; println!("已连接到服务器");
let (mut write, mut read) = ws_stream.split();
// 发送消息 write.send("你好,世界!".into()).await?; println!("已发送:你好,世界!");
// 读取响应 if let S