You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用tokio-tungstenite实现带超时的阻塞读取?

在tokio-tungstenite中实现带超时的WebSocket消息读取

可行方案:使用tokio的timeout函数

tokio-tungstenite基于tokio异步运行时,直接用tokio提供的tokio::time::timeout就能为读取操作添加超时控制,这是最简洁的实现方式。

代码示例

先确保导入必要模块:

use tokio::time::{timeout, Duration};
use tokio_tungstenite::{split::SplitStream, MaybeTlsStream, WebSocketStream};
use std::net::TcpStream;

修改读取逻辑如下:

// 定义超时时长,示例为5秒
let timeout_duration = Duration::from_secs(5);

// 用timeout包裹原有的read.next().await调用
match timeout(timeout_duration, read.next()).await {
    Ok(Some(Ok(msg))) => {
        // 成功读取到消息,执行你的业务逻辑
        println!("收到消息: {:?}", msg);
    }
    Ok(Some(Err(e))) => {
        // 读取过程中出现错误
        eprintln!("读取错误: {}", e);
    }
    Ok(None) => {
        // WebSocket流已被关闭
        eprintln!("WebSocket连接已关闭");
    }
    Err(_) => {
        // 超时触发
        eprintln!("读取超时");
    }
}

关键说明

  • timeout函数会将传入的异步任务包裹在超时逻辑内:
    • 若任务在指定时长内完成,返回Ok(任务结果)
    • 若任务未在时长内完成,返回Err(Elapsed)
  • 超时触发后,原始的SplitStream实例不会失效,后续仍可继续使用它进行读取
  • 可根据实际需求调整Duration的数值,比如毫秒级的Duration::from_millis(1000)

内容的提问来源于stack exchange,提问作者mentics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 21:12:36