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

如何在uWebSockets与C++中通过WebSocket周期性发送数据?

实现uWS主线程内WebSocket周期性发送数据

uWS本身提供了主线程事件循环内的定时器接口,完全可以替代额外线程实现服务端主动周期性推送数据,不需要依赖客户端轮询。

核心实现代码

修改你的WebSocketBehavior配置,在open回调中创建周期性定时器,并在连接关闭时清理定时器:

#include <string>

// 自定义userData结构体,用于存储定时器指针
struct data {
    uWS::Timer *timer = nullptr;
    // 可添加其他业务数据
};

uWS::App::WebSocketBehavior<data> WebSocketBehavior;

WebSocketBehavior.open = [](uWS::WebSocket<false, true, data> *ws)
{
    // 创建1秒执行一次的周期性定时器
    ws->userData->timer = ws->setInterval([ws]() {
        // 模拟获取变化的值(替换为你的业务逻辑)
        static int dynamicValue = 0;
        std::string pushMsg = "Updated value: " + std::to_string(++dynamicValue);
        
        // 发送文本消息到客户端
        ws->send(pushMsg, uWS::OpCode::TEXT);
    }, 1000); // 定时器间隔:1000毫秒
};

// 连接关闭时清理定时器,避免内存泄漏
WebSocketBehavior.close = [](uWS::WebSocket<false, true, data> *ws, int code, char *message, size_t length)
{
    if (ws->userData->timer) {
        ws->clearInterval(ws->userData->timer);
        ws->userData->timer = nullptr;
    }
};

// 启动uWS应用
uWS::App app;
app.ws<data>("/*", WebSocketBehavior)
   .listen(3000, [](auto *listenSocket) {
       if (listenSocket) {
           printf("Server running on port 3000\n");
       }
   })
   .run();

关键说明

  • setInterval:将定时器任务加入uWS的主线程事件循环,所有回调都在主线程执行,无需额外线程资源。
  • 定时器回调直接持有WebSocket指针,可实时调用send推送最新数据。
  • 必须在close回调中调用clearInterval清理定时器,防止连接关闭后定时器继续执行导致的无效内存访问。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:25:12