Rust WebSocket库:tokio-tungstenite 和 async-tungstenite

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

WebSocket 库 Rust:tokio-tungstenite 和 async-tungstenite



WebSocket 是一种协议,通过单个 TCP 连接在客户端和服务器之间提供双向通信。在 Rust 生态系统中,有两个主要的库用于 WebSocket:tokio-tungstenite(基于 Tokio 的异步库)和 async-tungstenite(异步库,但支持不同的运行时)。两者都基于底层库 tungstenite 构建,该库实现了 WebSocket 协议本身。



为什么要在 Rust 中使用 WebSocket?

Rust 是一种系统级语言,非常适合构建高负载的网络应用程序。Rust 的 WebSocket 库允许:

  • 创建实时聊天、游戏、通知系统
  • 以最小内存消耗处理数千个并发连接
  • 在编译级别利用 Rust 的内存安全性
  • 与其他异步库集成(例如,与 HTTP 服务器)


安装与配置

在 Cargo.toml 中添加依赖:

[dependencies]tokio = { version = "1", features = ["full"] }tokio-tungstenite = "0.21"futures-util = "0.3"


对于 async-tungstenite:

[dependencies]async-tungstenite = "0.25"async-std = "1.12"


在 Rust 中创建 WebSocket 客户端

一个简单的客户端示例,连接服务器并发送消息:

use futures_util::{SinkExt, StreamExt};use tokio_tungstenite::{connect_async, tungstenite::Message};

#[tokio::main]async fn main() { let url = "wss://echo.websocket.org"; let (mut ws_stream, _) = connect_async(url).await.expect("连接失败");

println!("已连接到服务器");

// 发送消息 ws_stream.send(Message::Text("你好, WebSocket!".into())).await.unwrap();

// 接收响应 if let Some(msg) = ws_stream.next().await { let msg = msg.unwrap(); if let Message::Text(text) = msg { println!("收到: {}", text); } }

ws_stream.close(None).await.unwrap();}


在 Rust 中创建 WebSocket 服务器

一个服务器,接受连接并返回回声响应:

use tokio::net::TcpListener;use tokio_tungstenite::accept_async;use futures_util::{SinkExt, StreamExt};use tokio_tungstenite::tungstenite::Message;

#[tokio::main]async fn main() { let listener = TcpListener::bind("127.0.0.1:8080").await.unwrap(); println!("服务器启动于 ws://127.0.0.1:8080");

while let Ok((stream, addr)) = listener.accept().await { tokio::spawn(async move { println!("新连接: {}", addr);

let ws_stream = accept_async(stream).await.unwrap(); let (mut sender, mut receiver) = ws_stream.split();

while let Some(msg) = receiver.next().await { match msg { Ok(Message::Text(text)) => { println!("来自 {} 的消息: {}", addr, text); sender.send(Message::Text(format!("回声: {}", text))).await.unwrap(); } Ok(Message::Close(_)) => break, _ => {} } }

println!("与 {} 的连接已关闭", addr); }); }}


库的主要功能

  • 支持 TLS/SSL — 通过 WSS 的安全连接(需要启用 tls 功能)
  • 自动重连 — 可通过循环和计时器实现
  • Ping/Pong 帧 — 用于保持连接
  • 二进制消息 — 处理 Message::Binary

推荐