Rust:axum学习笔记(7) websocket
接上一篇继续,今天来学习下如何用axum实现websocket,代码如下:
Cargo.toml添加依赖项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 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代码:
1 2 3 4 5 6 7 | socket = new WebSocket( 'ws://localhost:3000/ws' ); socket.addEventListener( 'message' , function (event) { console.log( 'Message from server ' , event.data); }); socket.send( '你好,RUST!' ); |
就能看到服务端回过来的内容
作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2014-01-24 java JAXB 学习