websockets必须有心跳吗?

时间:2017-09-08 08:09:01

标签: http websocket

当我读到websockets时,通常会提到心跳是必须的。 MDN甚至写了special opcode for heartbeats

但心跳是websockets的必备部分吗?我必须实现它,否则我的websockets将被浏览器或其他标准终止?

3 个答案:

答案 0 :(得分:10)

WebSocket协议的当前参考RFC 6455定义了一些控制帧来传达有关WebSocket的状态:

  • 关闭:0x8
  • Ping:0x9
  • Pong:0xA

Ping和Pong用于心跳,并允许您检查客户端是否仍然具有响应性。请参阅下面的quote

  

Ping帧可以作为keepalive或作为一种手段   验证远程端点是否仍然响应。

但是当客户端获得Ping时,必须将Pong发送回服务器。请参阅quote

  

收到Ping帧后,端点必须发送Pong帧   响应,除非它已经收到一个关闭框架。这应该   尽快回应Pong框架。

底线

在设计两者客户端和服务器时,支持心跳取决于您。但是如果你需要检查连接是否仍然存在,Ping和Pong帧是标准的方法。

请记住,如果发送了Ping并且没有发回Pong,则一个对等体可能会认为另一个对等体不再存在。

答案 1 :(得分:5)

取决于客户端和服务器实现,它是强制性的还是非强制性的。如果您连接到要求您使用PONG应答PING的服务器,则在您不回复时可能会断开连接。如果您是服务器且客户端正在向您发送PING,则相同。

服务器和客户端实现各不相同(有无数种),但是 浏览器的javascript客户端不发送PING,并且不提供任何API,尽管它使用PONG回复PING。

答案 2 :(得分:2)

P ping和Pongs不是强制性的。它们很有用,因为它们允许检测掉线连接。 (如果线路上没有一些流量,则无法检测断开的连接。)

请注意,在浏览器中,无法访问WebSocket心跳。如果您需要浏览器客户端代码来检测已断开的连接,则必须在应用程序级别实施听力操作。