151

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

我问的原因是我使用的是在 Mongrel2 后面运行的 python 框架,所以我想知道是否有办法向 Mongrel2 发送特定的 ping/pong 消息,告诉它在我的 python 应用程序不需要的情况下保持连接活动担心它。我猜这类似于为它提供一个单独的 HTTP 方法。而且我认为专用的 ping/pong 消息帧可能比字符串“ping”更简单(服务器和网络上的负载更少),尽管这可能无关紧要。

编辑:我刚刚查看了RFC 6455,看起来 Ping 和 Pong 绝对是具有自己操作码的控制帧类型。那么如何在 Chrome 中从 javascript 发送 Ping 帧?

4

3 回答 3

138

没有用于发送 ping 帧或接收 pong 帧的 Javascript API。您的浏览器要么支持,要么不支持。也没有 API 可以启用、配置或检测浏览器是否支持和正在使用 ping/pong 帧。有关于为此创建 Javascript ping/pong API的讨论。将来 ping 可能是可配置/可检测的,但 Javascript 不太可能直接发送和接收 ping/pong 帧。

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

于 2012-05-14T15:41:30.463 回答
16

Ping 仅从服务器发送到客户端,浏览器应尽快使用 Pong OpCode 自动回复。因此,您不必担心更高级别的问题。

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

于 2012-05-15T09:40:47.447 回答
4

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);  
    }  
}

于 2020-11-03T07:51:00.260 回答