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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:15:38