【一起学Rust | 框架篇 | ws-rs框架】属于Rust的Websocket框架——ws-rs

简介: 【一起学Rust | 框架篇 | ws-rs框架】属于Rust的Websocket框架——ws-rs



前言

ws-rs实现了MIO的WebSockets RFC6455标准。它允许在单个线程上处理多个连接,甚至可以在同一线程上生成新的客户端连接。这使得WebSockets非常快速且资源高效。API设计抽象了WebSocket协议的底层部分,使开发者可以专注于应用程序代码,而不必担心协议的一致性。


一、创建项目

首先还是老规矩,先创建本期内容所需要的工程,由于本期是通信类的Websocket,因此需要准备两个工程,一个server,一个client。

1. 创建服务端项目

cargo new ws_rs_server

然后添加依赖,将以下内容加入到工程Cargo.toml中,如下图所示

ws = "0.9.2"
env_logger = "0.6"

2. 创建客户端项目

cargo new ws_rs_client

然后添加依赖,同样加上刚才的依赖,

ws = "0.9.2"
env_logger = "0.6"

二、编写测试代码

1.服务端

首先是服务端部分的代码,使用该库需要引入ws::listen

use ws::listen;

然后在main中调用,实现监听操作,例如

// 监听地址并为每个连接调用闭包
    if let Err(error) = listen("127.0.0.1:3012", |out| {
        // 处理程序需要获取out的所有权,因此我们使用move
        move |msg| {
            // 处理在此连接上接收的消息
            println!("服务器收到消息 '{}'. ", msg);
            // 使用输出通道发送消息
            out.send(msg)
        }
    }) {
        // 通知用户故障
        println!("创建Websocket失败,原因: {:?}", error);
    }

listen需要传入两个参数,一个是监听的地址和端口,这里使用的是127.0.0.1:3012,然后就是个匿名函数,传入out,获取out的所有权,然后在其内部使用move关键字自动捕获msg,其中msg就是服务端收到的消息,在服务端开发中,主要处理的就是这部分内容。

这里处理客户端消息逻辑很简单,

  1. 输出从客户端接收到的消息
  2. 把客户端发送的消息返回

也就是说,实际上就是个echo,但是还是有点区别的,这个只返回一次。

2.客户端

客户端部分需要引入connect用来连接服务端,引入CloseCode来关闭连接。

use ws::{connect, CloseCode};

然后就是在main中调用,首先是connect,其调用方式和serverlisten是一样的,需要传入两个参数,

  1. wss连接,例如ws://127.0.0.1:3012,其中ws://表示使用websocket协议,127.0.0.1是ip地址,3012是端口,值得注意的是要和server相对应,否则会连接失败
  2. 一个闭包匿名函数,传入out

客户端的闭包匿名函数主要要做两件事,

  1. 发送消息到服务端
  2. 处理来自服务端的消息

这里的示例代码如下

// 连接到url并调用闭包
    if let Err(error) = connect("ws://127.0.0.1:3012", |out| {
        // 将WebSocket打开时要发送的消息排队
        if out.send("Hello WebSocket").is_err() {
            println!("Websocket无法初始消息排队")
        } else {
            println!("Client 发送消息 'Hello WebSocket'. ")
        }
        // 处理程序需要获取out的所有权,因此我们使用move
        move |msg| {
            // 处理在此连接上接收的消息
            println!("Client 收到消息 '{}'. ", msg);
            // 关闭连接
            out.close(CloseCode::Normal)
        }
    }) {
        // 通知用户故障
        println!("Failed to create WebSocket due to: {:?}", error);
    }

可以看到,这段代码的逻辑是,

  1. 先发送Hello WebSocket到服务端,同时判断发送过程中是否有错,如果发送出错,则输出Websocket无法初始消息排队,发送成功的情况下在客户端界面输出Client 发送消息 'Hello WebSocket'.
  2. 处理来自服务端的消息,可以看到这里和server是高度相似的,收到消息后,输出Client 收到消息 '{}'. ,其中{}是服务端消息的占位符,收到消息后直接断开服务端的连接

三、 运行效果

运行服务端

运行客户端


总结

本期学习了Rust的websocket通信框架ws-rs,并且编写了两个官方提供的小案例,通过本期内容的学习,你已学会了使用Rust来编写websocket程序,这个在开发中是具有里程碑意义的,你写的程序从此可以联网进行数据传输,使得程序给用户带来更好的体验,并且会让你的程序变得丰富多彩。

完整代码

服务端

use ws::listen;
fn main() {
    // 初始化日志
    env_logger::init();
    // 监听地址并为每个连接调用闭包
    if let Err(error) = listen("127.0.0.1:3012", |out| {
        // 处理程序需要获取out的所有权,因此我们使用move
        move |msg| {
            // 处理在此连接上接收的消息
            println!("服务器收到消息 '{}'. ", msg);
            // 使用输出通道发送消息
            out.send(msg)
        }
    }) {
        // 通知用户故障
        println!("创建Websocket失败,原因: {:?}", error);
    }
}

客户端

use ws::{connect, CloseCode};
fn main() {
    // 初始化日志
    env_logger::init();
    // 连接到url并调用闭包
    if let Err(error) = connect("ws://127.0.0.1:3012", |out| {
        // 将WebSocket打开时要发送的消息排队
        if out.send("Hello WebSocket").is_err() {
            println!("Websocket无法初始消息排队")
        } else {
            println!("Client 发送消息 'Hello WebSocket'. ")
        }
        // 处理程序需要获取out的所有权,因此我们使用move
        move |msg| {
            // 处理在此连接上接收的消息
            println!("Client got message '{}'. ", msg);
            // 关闭连接
            out.close(CloseCode::Normal)
        }
    }) {
        // 通知用户故障
        println!("Failed to create WebSocket due to: {:?}", error);
    }
}

本人创建了一起学Rust社区,欢迎各位对rust感兴趣的朋友加入

http://t.csdn.cn/AsEZ9
目录
相关文章
|
23天前
|
JavaScript 前端开发 测试技术
前端全栈之路Deno篇(五):如何快速创建 WebSocket 服务端应用 + 客户端应用 - 可能是2025最佳的Websocket全栈实时应用框架
本文介绍了如何使用Deno 2.0快速构建WebSocket全栈应用,包括服务端和客户端的创建。通过一个简单的代码示例,展示了Deno在WebSocket实现中的便捷与强大,无需额外依赖,即可轻松搭建具备基本功能的WebSocket应用。Deno 2.0被认为是最佳的WebSocket全栈应用JS运行时,适合全栈开发者学习和使用。
|
13天前
|
Rust 自然语言处理 API
|
2月前
|
JavaScript 前端开发 Java
【颠覆传统】Spring框架如何用WebSocket技术重塑实时通信格局?揭秘背后的故事与技术细节!
【9月更文挑战第4天】随着Web应用对实时交互需求的增长,传统的HTTP模型已无法满足现代应用的要求,特别是在需要持续、双向通信的场景下。WebSocket协议由此诞生,提供全双工通信渠道,使服务器与客户端能实时互发消息。作为Java开发中最受欢迎的框架之一,Spring通过其WebSocket模块支持这一协议,简化了WebSocket在Spring应用中的集成。
55 0
|
3月前
|
机器学习/深度学习 Rust 编译器
神秘编程语言 Rust 背后究竟隐藏着怎样的生态宝藏?框架、工具链与社区资源大揭秘!
【8月更文挑战第31天】Rust 语言凭借卓越性能与内存安全性吸引了众多开发者。其生态系统包括多种框架(如 Actix-web、Rocket 和 Warp)、强大的工具链(如包管理器 Cargo 和高效编译器)以及丰富的社区资源。Cargo 简化了项目管理,编译器提供详尽错误信息并支持增量编译,而活跃的社区则为学习与交流提供了广阔平台,涵盖官方文档、博客、论坛及大量 GitHub 开源项目。随着更多开发者的加入,Rust 生态系统将持续繁荣发展。
64 0
|
3月前
|
JavaScript 前端开发 网络协议
WebSocket在Java Spring Boot+Vue框架中实现消息推送功能
在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详细介绍如何在Java Spring Boot后端和Vue前端框架中利用WebSocket实现消息提醒功能。
158 0
|
3月前
|
网络协议 Go
[golang]gin框架接收websocket通信
[golang]gin框架接收websocket通信
101 0
|
6月前
|
前端开发 JavaScript API
|
5月前
|
Rust 前端开发 JavaScript
Tauri框架:使用Rust构建轻量级桌面应用
Tauri是一个用Rust构建的开源框架,用于创建轻量、安全且高效的跨平台桌面应用,结合Rust与Web技术(HTML/CSS/JS)。它遵循最小权限原则,仅在必要时调用OS API。Tauri架构包括Rust后端、Web前端、Tauri API和包装器。通过`cargo tauri init`可创建新项目,Rust后端处理系统交互,前端负责UI,两者通过Tauri API通信。Tauri支持自定义API、集成前端框架、资源管理、自动更新、系统集成和安全配置。此外,Tauri拥有插件系统和丰富的扩展能力,提供调试和测试工具,并有性能优化建议。
322 4
|
6月前
|
缓存 Rust 前端开发
【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建
【一起学Rust | 框架篇 | Tauri2.0框架】Tauri2.0环境搭建与项目创建
640 0
|
6月前
|
Web App开发 Rust 前端开发
【一起学Rust | 框架篇 | Tauri2.0框架】Tauri App开启远程调试功能
【一起学Rust | 框架篇 | Tauri2.0框架】Tauri App开启远程调试功能
551 0