当前位置:   article > 正文

使用 Rust & Warp 和 Docker 构建安全的 WebSocket 服务器_rust创建websocket服务器

rust创建websocket服务器

设置 Rust 项目

让我们开始使用 Cargo 设置 Rust 项目。在这种情况下,要创建我们的新项目

cargo new hello

请将Cargo.toml文件修改为如下所示:

  1. [package]
  2. name = "hello"
  3. version = "0.1.0"
  4. edition = "2022"
  5. [dependencies]
  6. tokio = {version = "1.4.0", features = ["rt", "rt-multi-thread", "macros"]}
  7. warp = {version="*", features = ["tls"]}
  8. futures = "*"

然后,您可以构建项目安装依赖项:

cargo build

从一个简单的 HTTP 服务器开始

  首先,让我们首先使用Warp设置 HTTP 服务器。

index.html当用户请求它时,这将返回一个简单的页面。首先,index.html在与 Rust 项目相同的根目录中创建,然后修改它,如下所示:

  1. <!DOCTYPE html>
  2. <html>
  3. <body>
  4. <script>
  5. window.onload = () => {
  6. const BACKEND_URL = "wss://" + window.location.hostname + ":9231/echo"
  7. const socket = new WebSocket(BACKEND_URL)
  8. socket.onopen = () => {
  9. console.log("Socket Opened")
  10. setInterval(_ => socket.send("Hello rust!"), 3000)
  11. }
  12. socket.onmessage = (msg) => alert(msg.data)
  13. socket.onerror = (err) => console.error(err)
  14. socket.onclose = () => console.log("Socket Closed")
  15. }
  16. </script>
  17. </body>
  18. </html>

这设置了一个基本的 WebSocket 客户端,它将发送“Hello rust!” 每 3 秒从客户端的浏览器到我们的 WebSocket 服务器。

接下来,我们需要生成一个公私密钥对,Warp 将使用它来安全地提供内容。在这种情况下,我们可以使用(在项目的根目录中)进行设置:

openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.rsa -out cert.pem

现在,在main.rs文件中,我们可以设置 HTTP 服务器,它将返回我们刚刚创建的上述 HTML,使用简单的 Warp 路由:

  1. use warp::Filter;
  2. #[tokio::main]
  3. async fn main() {
  4. let current_dir = std::env::current_dir().expect("failed to read current directory");
  5. let routes = warp::get().and(warp::fs::dir(current_dir));
  6. warp::serve(routes)
  7. .tls()
  8. .cert_path("cert.pem")
  9. .key_path("key.rsa")
  10. .run(([0, 0, 0, 0], 9231)).await;
  11. }

现在再次运行:

cargo run

这将在https://0.0.0.0:9231/index.html处显示一个空白页面,并要求您在浏览器上导航到该站点时接受证书警告。

现在页面将尝试连接到我们尚不存在的 WebSocket 服务器。

实现 WebSocket 服务器

然后我们可以设置 WebSocket 服务器,作为 Warp 服务器上的附加路由。您可以将main.rs文件修改为现在如下所示:

  1. use futures::StreamExt;
  2. use futures::FutureExt;
  3. use warp::Filter;
  4. #[tokio::main]
  5. async fn main() {
  6. let echo = warp::path("echo")
  7. .and(warp::ws())
  8. .map(|ws: warp::ws::Ws| {
  9. ws.on_upgrade(|websocket| {
  10. let (tx, rx) = websocket.split();
  11. rx.forward(tx).map(|result| {
  12. if let Err(e) = result {
  13. eprintln!("websocket error: {:?}", e);
  14. }
  15. })
  16. })
  17. });
  18. let current_dir = std::env::current_dir().expect("failed to read current directory");
  19. let routes = warp::get().and(echo.or(warp::fs::dir(current_dir)));
  20. warp::serve(routes)
  21. .tls()
  22. .cert_path("cert.pem")
  23. .key_path("key.rsa")
  24. .run(([0, 0, 0, 0], 9231)).await;
  25. }

 

现在创建了一个名为“echo”的路由,上面的实现只是将 WebSocket 上接收到的内容发送回相应的客户端。

现在,如果您使用 运行它cargo run,并导航到与以前相同的站点(https://0.0.0.0:9231/index.html),它将加载 JavaScript(来自index.html 之前创建的),它将尝试连接到echoWebSocket 端点并每 3 秒发送一条消息。

您将能够看到客户端通过alert(...)浏览器内置的机制从服务器接收响应。

注意:这个例子是使用Warp 文档构建的,以及它们的例子的组合——看看基本的 TLS基本的 WebSocket例子。

使用 Docker 构建和运行

  现在我们有一个正在运行的、安全的 HTTP 和 WebSocket 服务器,创建一个容器,我们可以在其中构建和运行我们的应用程序以供以后部署。

首先,在 Rust 项目的根目录中创建一个名为 的文件Dockerfile,并向其中添加以下内容:

 

  1. #使用最新的Rust官方镜像
  2. FROM rust:latest
  3. #将我们当前的工作目录复制到容器中
  4. COPY ./ ./
  5. #创建发布版本
  6. RUN cargo build --release
  7. #生成我们的自签名证书(相应地更改这些参数!)
  8. RUN openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.rsa -out cert.pem \
  9. -subj "/C=GB/ST=London/L=London/O=Global Security/OU=IT Department/CN=example.com"
  10. #我们的应用在EXPOSE 9231上运行的端口
  11. EXPOSE 9231
  12. #运行应用程序!
  13. CMD ["./target/release/hello"]

这是一个非常基本的示例,说明我们如何在容器中构建 Rust 应用程序,并在构建过程中生成自签名证书——您需要相应地更改证书信息的参数。

然后我们可以使用以下命令构建和运行容器:

  1. docker build -t hello 。
  2. docker run -p 9231:9231 -t hello

 

上面将构建一个名为hello的容器,然后运行该容器,并暴露 9231 端口与我们的应用程序通信。

当容器运行时,您可以再次在本地导航到与以前相同的 URL,以访问应用程序并测试它是否正常工作 - https://0.0.0.0:9231/index.html(记住接受自签名证书的风险)。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/582009
推荐阅读
相关标签
  

闽ICP备14008679号