ZBLOG

rust 优雅的实现wss

在 Rust 中优雅地实现 WebSocket Secure (WSS) 通常涉及使用合适的库以及清晰的代码结构。下面是一个示例,展示如何使用 actix-webtokio-tungstenite 以及 rustls 实现一个 WSS 服务器。

示例:优雅实现 WSS

  1. 创建新项目
   cargo new wss_example
   cd wss_example
  1. 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"] }
  1. 编写代码

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(())
}

如何运行

  1. 确保你有有效的 SSL/TLS 证书和私钥,并替换代码中的路径。

  2. 在项目目录下运行:

   cargo run
  1. 测试连接到 wss://localhost:8443/ws,可以用浏览器或 WebSocket 客户端工具(如 Postman)。

注意事项

  • 错误处理:本示例中包含了基本的错误处理,可以根据需要进一步增强。
  • 日志记录:可以使用更高级的日志库(如 logtracing)来记录信息。
  • 安全性:确保你的证书来源于受信任的 CA,以避免潜在的安全问题。

这个示例展示了如何通过清晰、模块化的方式构建一个 WSS 服务器,同时保持代码简洁易懂。你可以根据需要扩展功能,例如用户身份验证、状态管理等。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21019

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?