当前位置: 首页 > news >正文

用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码

用 Rust + Actix-Web 打造“Hello, WebSocket!”——从握手到回声,只需 50 行代码

一、为什么选择 Rust 写 WebSocket?

  • 零成本抽象:编译期确定生命周期,无 GC 抖动,延迟低至微秒级
  • actix-web:Tokio 生态最成熟的 Web 框架,单机轻松扛 100k 并发
  • 类型安全:消息格式一旦定义,编译器帮你杜绝“字段对不上”的运行时崩溃

二、核心代码逐行拆解

下面这份 echo 处理器就是全部业务逻辑——没有魔法,只有 Rust 标准流程:

pub async fn echo(req: HttpRequest,          // HTTP 升级握手请求stream: web::Payload,      // 原始 TCP 字节流
) -> Result<HttpResponse, Error> {// 1. 协议升级:返回 101 Switching Protocolslet (res, mut session, stream) = actix_ws::handle(&req, stream)?;// 2. 消息聚合:把可能分片的 WebSocket 帧拼成完整消息let mut stream = stream.aggregate_continuations().max_continuation_size(2_usize.pow(20)); // 1 MiB 上限// 3. 异步任务:在后台持续读写,不阻塞主线程rt::spawn(async move {while let Some(msg) = stream.next().await {match msg {Ok(AggregatedMessage::Text(text)) => {println!("↑ {}", text);session.text(text).await.unwrap(); // 原样回声}Ok(AggregatedMessage::Binary(bin)) => {println!("↑ (bin) {:x?}", bin);session.binary(bin).await.unwrap();}Ok(AggregatedMessage::Ping(p)) => {println!("↑ ping");session.pong(&p).await.unwrap(); // 保活}_ => {} // Close/Pong 直接忽略}}});Ok(res) // 4. 立即返回 101,升级完成
}

三、把 WebSocket 挂到路由表

config_routes 里加一行即可:

web::scope("/ws").route("", web::get().to(echo))

前端连接示例:

const ws = new WebSocket('ws://localhost:8080/api/ws');
ws.onmessage = (ev) => console.log('↓', ev.data);
ws.send('Hello Rust!');

四、性能小贴士

  1. 零拷贝session.text(text) 直接借用 String,无需额外克隆
  2. 背压保护max_continuation_size 限制单消息大小,防内存炸弹
  3. 任务隔离rt::spawn 让每条连接独立调度,互不影响

五、下一步?

  • broadcast 频道实现聊天室
  • serde 把 JSON 消息强类型化
  • rustls 升级成 wss 安全连接

完整项目已上传 GitHub,克隆即可跑:

git clone https://github.com/your-name/actix-ws-echo
cd actix-ws-echo && cargo run

打开浏览器,WebSocket 握手→回声,只需一次 cargo run,你就拥有了毫秒级延迟的实时通信后端。Enjoy Rust!


文章转载自:

http://cqv5A1cx.grwgw.cn
http://mOldtvcw.grwgw.cn
http://ubhBJ5Q9.grwgw.cn
http://tERAkkYr.grwgw.cn
http://wdxCLgPq.grwgw.cn
http://xOHHgohK.grwgw.cn
http://ps659eGM.grwgw.cn
http://lf1GedIH.grwgw.cn
http://7swoxbzT.grwgw.cn
http://gVjGthFL.grwgw.cn
http://foAjJppJ.grwgw.cn
http://u4yWe8oa.grwgw.cn
http://ZhZ7iS61.grwgw.cn
http://Tklj7IQh.grwgw.cn
http://slKnxhzb.grwgw.cn
http://ksq21PZQ.grwgw.cn
http://tOb8UXjv.grwgw.cn
http://sz819yUd.grwgw.cn
http://ppUTB2wN.grwgw.cn
http://3cPgZZA4.grwgw.cn
http://ECUx1pez.grwgw.cn
http://HRAHliJQ.grwgw.cn
http://tNmkE9NN.grwgw.cn
http://IAStnDSg.grwgw.cn
http://iNVdBOrI.grwgw.cn
http://MI4FEc1p.grwgw.cn
http://qzGekuP3.grwgw.cn
http://gaOIgnkF.grwgw.cn
http://0meOXDJc.grwgw.cn
http://oTdZhyBC.grwgw.cn
http://www.dtcms.com/a/367003.html

相关文章:

  • 【Java EE进阶 --- SpringBoot】Spring IoC
  • 机器学习基础-day03-机器学习中的线性回归
  • GPT-5冷酷操盘,游戏狼人杀一战封神!七大LLM狂飙演技,人类玩家看完沉默
  • FastGPT源码解析 Agent工作流编排后端详解
  • Python基础(①④内存管理机制)
  • 脑卒中目标检测含完整数据集
  • Unity核心概率⑤:GameObject
  • 【Python办公】tkinter词云图生成器
  • 使用Qt Charts实现高效多系列数据可视化
  • 【数据可视化-106】华为2025上半年财报分析:用Python和Pyecharts打造炫酷可视化大屏
  • tsconfig.json的target和module详解
  • 无人机气象观测技术
  • 【开题答辩全过程】以 小众商户小程序为例,包含答辩的问题和答案
  • house (ai)
  • Dify 从入门到精通(第 75/100 篇):Dify 的实时流式处理进阶(高级篇)
  • 从质疑到真香:小白使用「飞牛NAS」+「节点小宝」的花式操作
  • 关于NET Core jwt Bearer Token 验证的大坑,浪费3个小时,给各位兄弟搭个桥。
  • 人工智能学习:传统RNN模型
  • PyTorch DDP 随机卡死复盘
  • JVM 类加载全过程
  • 关于IDEA构建Gradle项目时报错“contentRootData“ is null的一次排查
  • devcpp 5.11的详细安装步骤
  • 高效菜单管理页面:一键增删改查
  • jmeter压测工具使用详情
  • finally 与 return的执行顺序
  • Java String vs StringBuilder vs StringBuffer:一个性能优化的探险故事
  • 邦芒干货:新入职场的人必须要知道的三大事情
  • JY-H818|科智立RFID高频读写器产品参数解析
  • LVDS系列27:Xilinx 7系 OSERDESE2原语(三)
  • [晕事]今天做了件晕事91,glibc,rand之前必须设置种子