在 Rust 中实现 WebSocket Secure (WSS) 连接,通常需要使用 tokio
和 tungstenite
这两个库。以下是一个使用 Actix-web、Tokio 和 Tungstenite 的示例,展示如何设置一个简单的 WSS 服务器。
步骤
- 创建一个新的 Cargo 项目
cargo new wss_example
cd wss_example
- 在
Cargo.toml
文件中添加依赖
[dependencies]
actix-web = "4"
tokio = { version = "1", features = ["full"] }
tungstenite = "0.19"
tokio-tungstenite = "0.17"
actix-tls = "4" # 添加 TLS 支持
rustls = { version = "0.20", features = ["dangerous_configuration"] }
- 编写 WSS 服务器代码
在 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?;
let (tx, rx) = ws_stream.split();
// Echo messages back to the client
let send_task = async {
while let Some(msg) = rx.next().await {
match msg {
Ok(msg) => {
if tx.send(msg).await.is_err() {
break; // 客户端关闭了连接
}
}
Err(_) => break,
}
}
};
send_task.await;
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));
// 启动 HTTP/HTTPS 服务器
HttpServer::new(|| {
App::new()
.route("/ws", web::get().to(websocket_handler)) // 设置 WebSocket 路由
})
.bind_openssl("127.0.0.1:8443", acceptor)? // 使用 bind_openssl 方法绑定 HTTPS/WSS
.run()
.await?;
Ok(())
}
注意事项
证书和私钥:
- 确保你有有效的 SSL/TLS 证书和私钥文件。这些文件应该放置在项目目录中,并替换为代码中的相应路径。
依赖管理:
- 根据你的需求调整
Cargo.toml
中的版本号。
- 根据你的需求调整
运行服务器:
- 使用命令运行服务器:
cargo run
- 使用命令运行服务器:
测试 WSS:
- 可以使用浏览器或 WebSocket 客户端工具(如 Postman)来连接到
wss://localhost:8443/ws
,并进行消息交互。
- 可以使用浏览器或 WebSocket 客户端工具(如 Postman)来连接到
这个例子展示了如何创建一个简单的 WSS WebSocket 服务器,它能够接受客户端连接并回显消息。根据具体需求,你可能会进一步扩展此基础实现。
内容由零声教学AI助手提供,问题来源于学员提问