R语言WebSocket:如何按指定间隔发送心跳/Ping包?
解决WebSocket定时发送Ping包且不阻塞主进程的方法
针对R语言websocket包中WebSocket对象无法导出、定时Ping会阻塞主进程的问题,可以用later包实现非阻塞的定时任务,它能和websocket依赖的事件循环兼容,无需子进程即可维持连接。
实现代码
library(websocket) library(later) # 初始化WebSocket连接 ws <- websocket::WebSocket$new("ws://websockets.chilkat.io/wsChilkatEcho.ashx", autoConnect = TRUE) # 监听服务器消息 ws$onMessage(function(event) { cat(Sys.time(), "Server response:", event$data, "\n") }) # 发送初始消息 ws$send("Hello world!") # 定义递归的Ping发送函数 send_ping <- function() { ws$send("Ping") # 60秒后再次调用自身,实现循环定时 later::later(send_ping, delay = 60) } # 启动第一次Ping任务(可选:可以延迟几秒再开始,避免刚连接就发Ping) later::later(send_ping, delay = 5) # 保持主进程运行(脚本环境必须添加,交互式环境如RStudio可省略) websocket::run_loop()
代码说明
later::later会将任务加入事件循环队列,不会阻塞主进程,onMessage依然能正常接收服务器消息- 递归调用
send_ping实现持续定时Ping,每次发送完成后自动安排下一次任务 websocket::run_loop()用于启动事件循环,脚本环境中必须添加才能维持连接和处理定时任务;交互式环境通常自带事件循环支持,可省略该语句
内容的提问来源于stack exchange,提问作者deluxefeeling
相关产品推荐
相关产品推荐

