Rust上的WebSocket:构建实时应用程序

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

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

开始课程

Rust 中 WebSocket 入门介绍



实时应用已成为现代网络不可或缺的一部分。聊天系统、在线游戏、股票报价和实时通知都需要客户端与服务器之间持续的双向数据交换。WebSocket 协议正好提供了这一能力,而 Rust 凭借其高性能和安全性,是构建此类系统的理想语言。



在本文中,我们将深入探讨如何使用 Rust 和 WebSocket 创建实时应用。您将了解流行的 crate、架构方法,并获取立即可用的代码示例,以便快速上手。



WebSocket 基础与库的选择



WebSocket 是一种协议,它通过单个 TCP 连接提供全双工通信。与客户端发起请求、服务器响应的 HTTP 不同,WebSocket 允许双方随时发送数据。



Rust 中用于 WebSocket 的流行 Crate



  • tokio-tungstenite — 基于 Tokio 的异步 WebSocket 客户端和服务器。轻量且快速。
  • actix-web — 功能强大的 Web 框架,内置 WebSocket 支持。
  • tungstenite — 同步版本,适用于简单场景。
  • warp — 另一个支持 WebSocket 的异步框架。


对于大多数项目,我们推荐使用 tokio-tungstenite 或 actix-web。前者适用于轻量级服务器和客户端,后者适用于功能完备的 Web 应用。



在 Rust 中创建 WebSocket 服务器



让我们来看一个简单的回声服务器,它接收消息并将消息原样返回给客户端。我们将使用 tokio-tungstenite。



项目设置



创建一个新的 Cargo 项目,并在 Cargo.toml 中添加依赖项:



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


基础回声服务器



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

#[tokio::main]async fn main() -> Result<(), Box> { let listener = TcpListener::bind("127.0.0.1:8080").await?; println!("Server started on ws://127.0.0.1:8080");

while let Ok((stream, addr)) = listener.accept().await { println!("New connection: {}", addr); tokio::spawn(handle_connection(stream)); }

Ok(())}

async fn handle_connection(stream: tokio::net::TcpStream) { let ws_stream = accept_async(stream).await.unwrap(); let (mut write, mut read) = ws_stream.split();

while let Some(msg) = read.next().await { let msg = msg.unwrap(); // Send the message back write.send(msg).await.unwrap(); }}


这段代码创建了一个监听 8080 端口的 TCP 服务器,接受 WebSocket 连接,并为每个客户端启动一个异步任务,将接收到的所有消息原样返回。



在 Rust 中创建 WebSocket 客户端



现在让我们编写一个客户端,连接到我们的服务器,发送一条消息,并接收响应。



use futures_util::StreamExt;use tokio_tungstenite::connect_async;

#[tokio::main]async fn main() -> Result<(), Box> { let url = "ws://127.0.0.1:8080"; let (ws_stream, _) = connect_async(url).await?;

println!("Connected to server");

let (mut write, mut read) = ws_stream.split();

// Send a message write.send("Hello, WebSocket!".into()).await?;

// Receive a response if let Some(msg) = read.next().await { let msg = msg?; println!("Received: {}", msg.to_text().unwrap()); }

Ok(())}


使用 actix-web 实现实时聊天



现在让我们

博客

书籍推荐