【问题标题】:How do i know if connection is alive with websockets?我如何知道 websockets 的连接是否存在?
【发布时间】:2012-08-02 07:14:30
【问题描述】:

我有一个在浏览器中运行的 web 应用程序。该 webapp 连接到使用 websockets 的服务器。所以服务器和我的客户端/浏览器之间的通信是基于 websockets 的。如果服务器上发生了一些神奇的事件,一些 web 服务会向我的 webapp 发送一个新的 XML / JSON 并显示新的数据。

但是,作为客户端/浏览器,我如何知道连接是否仍然存在?假设我在大约 30 秒内没有得到任何新的 XML。我怎么知道连接是否关闭/断开/服务器脱机或一切正常,但在服务器本身上没有发生新的魔术事件。

【问题讨论】:

    标签: websocket dart


    【解决方案1】:

    三种方式:

    • 依靠 TCP 检测连接丢失,最终会在 JS onclose 事件中弹出
    • 从服务器发送 WebSocket ping .. 浏览器将回复 WS pongs,在客户端也可能更可靠地检测到连接丢失
    • 从浏览器向服务器发送应用级心跳,服务器需要有逻辑才能回复。您无法从浏览器(在 JS 中)触发 WS ping

    【讨论】:

    • 标准中没有定义吗?还是我必须手动完成所有“工作”?
    • 该标准提供了一种方法来检测和通知与 TCP 相关的连接失败的端点(这往往包括许多服务器问题的情况)。如果您希望能够在 TCP 发现故障或 TCP 连接处于活动状态但服务器本身未处理消息的错误情况之前检测到故障,您将需要手动进行。
    • 好的,我明白了,但似乎有点模糊。它看起来像是通往罗马的 7 条不同的道路。
    • 您可以尝试定期在套接字上写入。如果套接字损坏,则会引发错误,您可以捕获该错误并重新建立套接字。
    【解决方案2】:

    websocket 连接对象有一个readyState 字段,它将告诉您连接是否仍然处于活动状态(from the dart documentation)。 readyState 可以是

    0 - connection not yet established
    1 - conncetion established
    2 - in closing handshake
    3 - connection closed or could not open
    

    如果这是您想要处理的事情(尝试重新连接等),您还可以为 websocket close 事件定义一个事件处理程序。

    【讨论】:

    • 对于任何查看上述评论的人:根据我的经验,使用 socket.close() 关闭套接字会改变就绪状态
    • 是的,我同意 Brandon 的观点,当您关闭连接时,它会显示“3”
    • @megawac 是对的 - 我刚刚拔掉了我的服务器,浏览器中的 websocket 仍然处于 readyState 1。您必须执行常规 ping/pong 来确定连接是否保持活动状态。
    • 是的,用 ws.close 关闭连接会改变 readyState - 离线不会!
    • @GregJohnson 整个协议进入乒乓模式
    猜你喜欢
    • 2013-12-18
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2018-06-29
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多