当前位置: 首页 > 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://www.xdnf.cn/news/1451935.html

相关文章:

  • Energy期刊论文学习——基于集成学习模型的多源域迁移学习方法用于小样本实车数据锂离子电池SOC估计
  • 邮件如何防泄密?这10个电子邮件安全解决方案真的好用,快收藏
  • Windows+Docker一键部署CozeStudio私有化,保姆级
  • 15、Docker构建前端镜像并运行
  • 计算机大数据毕业设计推荐:基于Spark的新能源汽车保有量可视化分析系统
  • 配置阿里云 YUM 源指南
  • IPV6之DHCPv6服务器和中继代理和前缀代理服务器客户端
  • 高并发商城 商品为了防止超卖,都做了哪些努力?
  • PostgreSQL18-FDW连接的 SCRAM 直通身份验证
  • 当便捷遇上复杂,低代码的路该怎么走?
  • Linux 基础IO-从 “一切皆文件” 到自定义 libc 缓冲区
  • fastmcp2.0的传输方式
  • DFT:从RL的视角修正SFT损失的权重
  • 【高分论文密码】大尺度空间模拟预测与数字制图
  • Django事务
  • Leetcode 240. 搜索二维矩阵 II 矩阵 / 二分
  • 垃圾回收,几种GC算法及GC机制
  • 数据库中事务、指令、写法解读
  • 搭建基于 Solon AI 的 Streamable MCP 服务并部署至阿里云百炼
  • 【多线程初阶】线程安全问题 死锁产生 何如避免死锁
  • 前端vue常见标签属性及作用解析
  • 零售消费企业的数字化增长实践,2025新版下载
  • 在 Debian 系统上清理缓存的方式和具体操作方法
  • Grafana - 监控磁盘使用率Variables使用
  • 卫星互联网安全风险及关键技术探索
  • 【深度学习】P1 引言(待完成)
  • Conda 常用命令大全
  • Axure RP 9 Mac 交互原型设计
  • iPhone17再爆猛料?苹果2025秋季发布会亮点抢先看
  • Jenkins调用ansible部署lnmp平台