上一篇继续,今天来学习下如何用axum实现websocket,代码如下:

Cargo.toml添加依赖项

[package]
name = "websocket"
version = "0.1.0"
edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies]
axum = {version = "0.4.3", features = ["headers","ws"] }
tokio = { version = "1.0", features = ["full"] }
tracing = "0.1"
tracing-subscriber = { version="0.3", features = ["env-filter"] }
tower-http = { version = "0.2.0", features = ["fs", "trace"] }
headers = "0.3"

关键是axum的features中的ws,接下来是示例代码main.rs

use axum::{
extract::{
ws::{Message, WebSocket, WebSocketUpgrade},
TypedHeader,
},
response::IntoResponse,
routing::{get},
Router,
};
use std::net::SocketAddr;
use tower_http::{
trace::{DefaultMakeSpan, TraceLayer},
}; #[tokio::main]
async fn main() {
if std::env::var_os("RUST_LOG").is_none() {
std::env::set_var("RUST_LOG", "example_websockets=debug,tower_http=debug")
}
tracing_subscriber::fmt::init(); let app = Router::new()
.route("/", get(|| async { "Hello, World!" }))
//绑定websocket路由
.route("/ws", get(ws_handler))
.layer(
TraceLayer::new_for_http()
.make_span_with(DefaultMakeSpan::default().include_headers(true)),
); let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
tracing::debug!("listening on {}", addr);
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await
.unwrap();
} async fn ws_handler(
ws: WebSocketUpgrade,
user_agent: Option<TypedHeader<headers::UserAgent>>,
) -> impl IntoResponse {
if let Some(TypedHeader(user_agent)) = user_agent {
println!("`{}` connected", user_agent.as_str());
} ws.on_upgrade(handle_socket)
} async fn handle_socket(mut socket: WebSocket) {
if let Some(msg) = socket.recv().await {
if let Ok(msg) = msg {
println!("Client says: {:?}", msg);
//客户端发什么,服务端就回什么(只是演示而已)
if socket
.send(Message::Text(format!("{:?}", msg)))
.await
.is_err()
{
println!("client disconnected");
return;
}
} else {
println!("client disconnected");
return;
}
}
}

核心就是handle_socket这个function,这里我们只是简单的将收到的内容,原封不动的发回浏览器。

运行一下:

先浏览http://localhost:3000/ 然后F12打开Console控制台,输入下面几行js代码:

socket = new WebSocket('ws://localhost:3000/ws');

socket.addEventListener('message', function (event) {
console.log('Message from server ', event.data);
}); socket.send('你好,RUST!');

就能看到服务端回过来的内容

Rust:axum学习笔记(7) websocket的更多相关文章

  1. Rust语言学习笔记(7)

    模块 // 兄弟模块 mod network { fn connect() { } } mod client { fn connect() { } } // 父子模块 mod network { fn ...

  2. Python Web学习笔记之WebSocket 通信过程与实现

    一.什么是 WebSocket ? WebSocket 是一种标准协议,用于在客户端和服务端之间进行双向数据传输.但它跟 HTTP 没什么关系,它是基于 TCP 的一种独立实现. 以前客户端想知道服务 ...

  3. Python Web学习笔记之WebSocket原理说明

    众所周知,Web应用的通信过程通常是客户端通过浏览器发出一个请求,服务器端接收请求后进行处理并返回结果给客户端,客户端浏览器将信息呈现.这种机制对于信息变化不是特别频繁的应用可以良好支撑,但对于实时要 ...

  4. Rust语言学习笔记(6)

    Traits(特质) // 特质 pub trait Summary { fn summarize(&self) -> String; } pub struct NewsArticle ...

  5. Rust语言学习笔记(5)

    Structs(结构体) struct User { username: String, email: String, sign_in_count: u64, active: bool, } let ...

  6. Rust语言学习笔记(4)

    Variables and Mutability(变量和可变性) 变量声明有三种:不变量(运行期的常量),变量以及(编译期的)常量. 变量可以重复绑定,后声明的变量覆盖前面声明的同名变量,重复绑定时可 ...

  7. WebSocket学习笔记IE,IOS,Android等设备的兼容性问

    WebSocket学习笔记IE,IOS,Android等设备的兼容性问 一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏 ...

  8. WebSocket学习笔记——无痛入门

    WebSocket学习笔记——无痛入门 标签: websocket 2014-04-09 22:05 4987人阅读 评论(1) 收藏 举报  分类: 物联网学习笔记(37)  版权声明:本文为博主原 ...

  9. Netty学习笔记(六) 简单的聊天室功能之WebSocket客户端开发实例

    在之前的Netty相关学习笔记中,学习了如何去实现聊天室的服务段,这里我们来实现聊天室的客户端,聊天室的客户端使用的是Html5和WebSocket实现,下面我们继续学习. 创建客户端 接着第五个笔记 ...

  10. SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序

    SpringBoot学习笔记(11):使用WebSocket构建交互式Web应用程序 快速开始 本指南将引导您完成创建“hello world”应用程序的过程,该应用程序在浏览器和服务器之间来回发送消 ...

随机推荐

  1. 基于Python和uiautomation的Windows桌面自动化操作方案

    基于Python和uiautomation的Windows桌面自动化操作方案 在日常开发和测试过程中,我们经常需要对Windows桌面应用程序进行自动化操作.本文将记录如何使用uiautomation ...

  2. 【记录】LaTeX|Overleaf中ACM的LaTex模板的图片引用出现问号

    问题 单张图片引用,出现如下问题: 出问题的LaTeX部分: As is shown in Figure~\ref{img:result}: \begin{figure}[h] \centering ...

  3. Java和C++性能大比拼

    用来运行Java语言的HotSpot VM主要是用C++语言来写的,所以我们在研究JDK时不得不去学习C++这门语言.C++和Java都是面向对象的语言,所以它们常被拿来做比较.本文将从性能的角度对比 ...

  4. 【转载】coroutine 与 goroutine 区别

    如下原文转载自C语言中文网 C#.Lua.Python 语言都支持 coroutine 特性.coroutine 与 goroutine 在名字上类似,都可以将函数或者语句在独立的环境中运行,但是它们 ...

  5. 异步之舞:FastAPI与MongoDB的深度协奏

    title: 异步之舞:FastAPI与MongoDB的深度协奏 date: 2025/05/18 19:09:08 updated: 2025/05/18 19:09:08 author: cmdr ...

  6. PLsql and 汉化包的安装使用

    一.准备工作 1.点击下载PLSQL,本次安装的PLSQL版本为12.0.7,建议安装64位. 2.下载PLSQL时,版本旁边会有个"Language pack"的链接,点击后左侧 ...

  7. 浅析Java8中default关键字

    摘要:介绍Java8新增关键字default,它用于在接口中标记方法为默认方法和编写实现逻辑,方便通过新增方法重构接口,而无需修改所有实现类,目的在于兼容接口已有实现类. 综述   default关键 ...

  8. 自动装配组件@Resource和@Autowired的区别

      @Resource和@Autowired这两个注解都提供了将依赖对象注入到当前对象的功能,但二者却有众多区别,并且它们是常见的面试题之一,所以楼兰胡杨今天就来梳理它,希望对各位有所帮助.首先,梳理 ...

  9. SecureCRT 8.5 配置自动记录日志

    两种方式记录日志 1.手动记录日志 文件--会话日志 选择需要保存的位置和文件名 2.全局自动记录所有日志 选项--全局选项 常规--默认会话--编辑默认设置 类别--终端--日志文件 配置日志文件名 ...

  10. 【2020.12.02提高组模拟】球员(player) 题解

    [2020.12.02提高组模拟]球员(player) 题解 题意描述 基本的递推. ①所有运动员姓氏的长度必须不同. ②每个运动员的姓氏必须是长度比其长的所有其他运动员姓氏的连续子串 潜在的球员分成 ...