在 Rust 中优雅地实现 WebSocket Secure (WSS) 通常涉及使用合适的库以及清晰的代码结构。下面是一个示例,展示如何使用 actix-web
和 tokio-tungstenite
以及 rustls
实现一个 WSS 服务器。
示例:优雅实现 WSS
- 创建新项目
cargo new wss_example
cd wss_example
- 在
Cargo.toml
文件中添加依赖
[dependencies]
actix-web = "4"
tokio = { version = "1", features = ["full"] }
tokio-tungstenite = "0.17"
actix-tls = "4" # 支持 TLS
rustls = { version = "0.20", features = ["dangerous_configuration"] }
- 编写代码
在 src/main.rs
中实现以下内容:
use actix_web::{web, App, HttpServer};
use actix_tls::accept::TlsAcceptor;
use rustls::{ServerConfig, NoClientAuth};
use std::sync::Arc;
use tokio_tungstenite::tungstenite::protocol::Message;
use tokio_tungstenite::accept_async;
async fn websocket_handler(ws: web::Payload) -> Result<actix_web::HttpResponse, actix_web::Error> {
let ws_stream = accept_async(ws).await.expect("Error accepting WebSocket connection");
// 使用 split 将流分开为发送和接收部分
let (mut tx, mut rx) = ws_stream.split();
// 启动任务来处理接收消息并回显它们
while let Some(msg) = rx.next().await {
match msg {
Ok(Message::Text(text)) => {
println!("Received: {}", text);
// 回显消息
if let Err(e) = tx.send(Message::Text(text)).await {
eprintln!("Error sending message: {:?}", e);
break; // 如果发送失败,退出循环
}
},
Ok(_) => {},
Err(e) => {
eprintln!("WebSocket error: {:?}", e);
break; // 出现错误时退出循环
}
}
}
Ok(actix_web::HttpResponse::Ok().finish())
}
#[tokio::main]
async fn main() -> std::io::Result<()> {
// 创建 rustls 配置
let mut config = ServerConfig::new(NoClientAuth);
// 加载证书和私钥(请确保提供正确的路径)
let certs = vec![
rustls::Certificate(std::fs::read("path/to/cert.pem").unwrap()),
];
let key =
rustls::PrivateKey(std::fs::read("path/to/key.pem").unwrap());
config.set_single_cert(certs, key).expect("Invalid certificate");
let acceptor = TlsAcceptor::from(Arc::<ServerConfig>::new(config));
HttpServer::new(|| {
App::new()
.route("/ws", web::get().to(websocket_handler))
.default_service(web::__404()) // 处理未匹配路由返回404
})
.bind_openssl("127.0.0.1:8443", acceptor)?
.run()
.await?;
Ok(())
}
如何运行
确保你有有效的 SSL/TLS 证书和私钥,并替换代码中的路径。
在项目目录下运行:
cargo run
- 测试连接到
wss://localhost:8443/ws
,可以用浏览器或 WebSocket 客户端工具(如 Postman)。
注意事项
- 错误处理:本示例中包含了基本的错误处理,可以根据需要进一步增强。
- 日志记录:可以使用更高级的日志库(如
log
或tracing
)来记录信息。 - 安全性:确保你的证书来源于受信任的 CA,以避免潜在的安全问题。
这个示例展示了如何通过清晰、模块化的方式构建一个 WSS 服务器,同时保持代码简洁易懂。你可以根据需要扩展功能,例如用户身份验证、状态管理等。
内容由零声教学AI助手提供,问题来源于学员提问