如何在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
相关产品推荐
相关产品推荐

