从浏览器发送 websocket 乒乓框架

我一直在阅读关于 websocket 中的乒乓消息以保持连接活跃,但我不确定它们是什么。它是一种独特的框架类型吗?(我没有在 javascript WebSocket 对象上看到任何与乒乓球相关的 chrome 方法)。或者它只是一个设计模式(例如,我直接向服务器发送“ ping”或任何其他字符串并让它响应)。乒乓球和延续框架有什么关系吗?

我问这个问题的原因是我使用的是一个运行在 Mongrel2之后的 python 框架,所以我想知道是否有一种方法可以向 Mongrel2发送一个特定的乒乓消息,告诉它保持连接活跃,而不用担心我的 python 应用程序。我猜,这类似于有一个单独的 HTTP 方法。我想专用的 ping/pong 消息框架可能比字符串“ ping”更简单(服务器和网络的负载更少) ,尽管这可能不太重要。

编辑: 我刚刚看了 RFC 6455,它看起来像乒乓肯定是控制帧类型与他们自己的操作码。那么如何在 Chrome 中从 javascript 发送一个 Ping 框架呢?

160721 次浏览

没有用于发送 ping 帧或接收 pong 帧的 Javascript API。您的浏览器是否支持这一点。也没有 API 来启用、配置或检测浏览器是否支持和正在使用乒乓球框架。这个有 关于创建 Javascript ping/pong API 的讨论。将来 ping 可能是可配置/可检测的,但 Javascript 不太可能直接发送和接收 ping/pong 帧。

但是,如果您同时控制客户机和服务器代码,那么您可以轻松地在更高的级别添加乒乓支持。如果您还没有消息类型头/元数据,那么在您的消息中将需要某种类型的消息类型头/元数据,但是这非常简单。除非您计划每秒发送数百次 ping,或者拥有数千个同时发送的客户端,否则自己完成这项工作的开销将会非常小。

更新: 虽然答案是旧的,它在谷歌的顶部结果。 在握手后的任何时刻,客户端或服务器都可以选择向对方发送 ping 消息

Ping 只能从服务器发送到客户端,浏览器应该尽快用 Pong OpCode 自动应答。所以你在更高层次上不必担心这个。

尽管并非所有的浏览器都支持标准,但它们在实现这种机制时可能会有一些差异,甚至可能意味着没有 Pong 响应功能。但就我个人而言,我正在使用 Ping/Pong,并且从来没有见过客户端不实现这种类型的 OpCode 和低级客户端实现的自动响应。

在 js 中的一个可能的解决方案

如果 WebSocket 服务器在几分钟后断开 ws链接,那么在服务器和客户机之间就不会发送任何消息。

  1. 客户端主动发送一个定制的 ping消息,通过使用 keepAlive函数保持活动

  2. 服务器端将忽略自定义 ping消息并响应自定义 pong消息

let timerId = 0;


function keepAlive(timeout = 20000) {
if (webSocket.readyState == webSocket.OPEN) {
webSocket.send('');
}
timerId = setTimeout(keepAlive, timeout);
}


function cancelKeepAlive() {
if (timerId) {
clearTimeout(timerId);
}
}