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

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

一、为什么选择 Rust 写 WebSocket?

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

二、核心代码逐行拆解

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

rust 复制代码
pub async fn echo(
    req: HttpRequest,          // HTTP 升级握手请求
    stream: web::Payload,      // 原始 TCP 字节流
) -> Result<HttpResponse, Error> {
    // 1. 协议升级:返回 101 Switching Protocols
    let (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 里加一行即可:

rust 复制代码
web::scope("/ws").route("", web::get().to(echo))

前端连接示例:

javascript 复制代码
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,克隆即可跑:

bash 复制代码
git clone https://github.com/your-name/actix-ws-echo
cd actix-ws-echo && cargo run

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

相关推荐
CoderYanger1 小时前
Java EE 进阶:2.3 JavaScript
java·开发语言·前端·javascript·css·职场和发展·java-ee
恋猫de小郭1 小时前
ADB Wi-Fi 2.0 ,Android 17 把无线调试的连接链路重新做了一遍
android·前端·flutter
薛一半1 小时前
React路由初始
前端·react.js·前端框架
问心无愧05131 小时前
ctf show web 178
前端·笔记
岁岁种桃花儿1 小时前
Vue组件化编程第二篇:非单位件组件
前端·javascript·vue.js
晓得迷路了1 小时前
栗子前端技术周刊第 146 期 - React 19.3、jQuery 1.0 20 周年、Bun 1.4.2...
前端·javascript·react.js
雪芽蓝域zzs1 小时前
第四十四节:封装通用表格多选、批量操作组合式函数
前端·javascript·vue.js
那年窗外下的雪.1 小时前
AIDC 学习日志|第 25 天|设备输出反推、MAC Flapping 与 EAD 撤销
前端·网络·git·学习·macos
IT_陈寒1 小时前
Vite的HMR怎么突然罢工了?原来是我漏了这个配置
前端·人工智能·后端
柳杉1 小时前
从调研到闭环,我用 GPT-Image-2.5 和 GPT-6 Astra 把智慧厂房 3D 大屏这条链路走完了
前端·ai编程·数据可视化