如何判断使用WebSockets连接是否存活?

24

我有一个网页应用程序,运行在浏览器中。该应用程序连接到一个使用WebSockets的服务器上。因此,服务器和我的客户端/浏览器之间的通信基于WebSockets。如果服务器上发生了某些魔法事件,某个Web服务会向我的Web应用程序发送新的XML / JSON数据,然后新数据将被显示。

但是,作为客户端/浏览器,我如何知道连接是否仍然存在?假设我在大约30秒内没有收到任何新的XML。我怎样才能知道连接关闭/中断/服务器离线还是一切正常,只是在服务器上没有发生新的魔法事件。

2个回答

26
一个 WebSocket 连接对象有一个 readyState 字段,用于告知连接是否仍然活跃 (来自 dart 文档)。readyState 可以是以下两种状态之一:
0 - connection not yet established
1 - conncetion established
2 - in closing handshake
3 - connection closed or could not open

如果您希望处理websocket的close事件(尝试重新连接等),您还可以为其定义事件处理程序。


1
对于任何查看上面评论的人:根据我的经验,使用socket.close()关闭套接字将更改其就绪状态。 - Brandon
是的,我同意Brandon的观点,当你关闭连接时它会显示“3”。 - Francisco Gutiérrez
4
@megawac是正确的 - 我刚刚拔掉了我的服务器,但浏览器中的websocket仍然保持在readyState 1状态。您需要定期进行ping/pong操作以确定连接是否仍然活动。 - Greg Johnson
1
关闭连接时,使用ws.close将更改readyState状态 - 离线不会! - Rune Jeppesen
@GregJohnson,整个协议都进入了乒乓模式。 - PirateApp

20

3种方法:

  • 依赖TCP检测连接丢失,最终会在JS的onclose事件中弹出
  • 从服务器发送WebSocket ping,浏览器将回复WS pong,连接丢失可能更加稳健地在客户端侦测到
  • 从浏览器向服务器发送应用层心跳,服务器需要有逻辑来回复。你不能从浏览器(在JS中)触发WS ping。

标准中没有定义吗?还是我必须手动完成所有的“工作”? - Gero
该标准提供了一种检测和通知TCP相关连接故障的方式(这往往包括许多服务器问题的情况)。如果您想在TCP发现故障之前检测到故障或者出现TCP连接仍然存活但服务器本身未处理消息的错误条件,您需要手动完成。 - zaphoyd
我理解了,但似乎有些含糊不清。这看起来像通往罗马的七条不同的道路。 - Gero
您可以定期尝试在套接字上进行写操作。如果套接字已断开,则会抛出错误,您可以捕获该错误并重新建立套接字。 - Utsav Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接