ZBLOG

rust 优雅的实现wss

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

示例:优雅实现 WSS

  1. 创建新项目
  1. cargo new wss_example
  2. cd wss_example
  1. Cargo.toml 文件中添加依赖
  1. [dependencies]
  2. actix-web = "4"
  3. tokio = { version = "1", features = ["full"] }
  4. tokio-tungstenite = "0.17"
  5. actix-tls = "4" # 支持 TLS
  6. rustls = { version = "0.20", features = ["dangerous_configuration"] }
  1. 编写代码

src/main.rs 中实现以下内容:

  1. use actix_web::{web, App, HttpServer};
  2. use actix_tls::accept::TlsAcceptor;
  3. use rustls::{ServerConfig, NoClientAuth};
  4. use std::sync::Arc;
  5. use tokio_tungstenite::tungstenite::protocol::Message;
  6. use tokio_tungstenite::accept_async;
  7. async fn websocket_handler(ws: web::Payload) -> Result<actix_web::HttpResponse, actix_web::Error> {
  8. let ws_stream = accept_async(ws).await.expect("Error accepting WebSocket connection");
  9. // 使用 split 将流分开为发送和接收部分
  10. let (mut tx, mut rx) = ws_stream.split();
  11. // 启动任务来处理接收消息并回显它们
  12. while let Some(msg) = rx.next().await {
  13. match msg {
  14. Ok(Message::Text(text)) => {
  15. println!("Received: {}", text);
  16. // 回显消息
  17. if let Err(e) = tx.send(Message::Text(text)).await {
  18. eprintln!("Error sending message: {:?}", e);
  19. break; // 如果发送失败,退出循环
  20. }
  21. },
  22. Ok(_) => {},
  23. Err(e) => {
  24. eprintln!("WebSocket error: {:?}", e);
  25. break; // 出现错误时退出循环
  26. }
  27. }
  28. }
  29. Ok(actix_web::HttpResponse::Ok().finish())
  30. }
  31. #[tokio::main]
  32. async fn main() -> std::io::Result<()> {
  33. // 创建 rustls 配置
  34. let mut config = ServerConfig::new(NoClientAuth);
  35. // 加载证书和私钥(请确保提供正确的路径)
  36. let certs = vec![
  37. rustls::Certificate(std::fs::read("path/to/cert.pem").unwrap()),
  38. ];
  39. let key =
  40. rustls::PrivateKey(std::fs::read("path/to/key.pem").unwrap());
  41. config.set_single_cert(certs, key).expect("Invalid certificate");
  42. let acceptor = TlsAcceptor::from(Arc::<ServerConfig>::new(config));
  43. HttpServer::new(|| {
  44. App::new()
  45. .route("/ws", web::get().to(websocket_handler))
  46. .default_service(web::__404()) // 处理未匹配路由返回404
  47. })
  48. .bind_openssl("127.0.0.1:8443", acceptor)?
  49. .run()
  50. .await?;
  51. Ok(())
  52. }

如何运行

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

  2. 在项目目录下运行:

  1. 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

注册

已经有帐号?