【问题标题】:Websockets and uwsgi - detect broken connections client side?Websockets 和 uwsgi - 检测客户端断开的连接?
【发布时间】:2014-11-12 22:41:24
【问题描述】:

我正在使用 uwsgi 的 websockets 支持,到目前为止它看起来很棒,服务器检测客户端何时断开连接,客户端以及服务器何时关闭。但我担心这不适用于每种情况/浏览器。

在其他框架(即 sockjs)中,通过发送作为心跳/ping 的常规消息来监控连接。但是 uwsgi 根据 websockets 规范发送 PING/PONG 帧(即不是常规消息/控制帧),因此从客户端我无法知道从服务器接收到最后一次 ping 的时间。所以我的问题是:

如果连接被某些代理断开或阻止,浏览器(即 Chrome、IE、Firefox、Opera)是否会可靠地检测到没有从服务器接收到 PING 并发出连接断开的信号,或者我应该实施一些额外的 ping/pong系统,以便从客户端检测到连接已关闭?

谢谢

【问题讨论】:

    标签: websocket uwsgi


    【解决方案1】:

    你完全正确。客户端无法跟踪或发送 ping/pong。因此,如果连接断开,服务器能够通过 ping/pong 检测到这种情况,但是让客户端挂起......直到它尝试发送某些东西并且底层 TCP 机制检测到另一端没有确认它的数据包.

    因此,如果客户端应用程序希望大部分时间都在“监听”,那么实现一个“双向”工作的保持活动系统可能会很方便,正如 Stephen Clearly 在您发布的链接中所解释的那样。但是,这个保活系统将是您的应用程序层的一部分,而不是作为 ping/pong 的传输层的一部分。

    例如,您可以有一条消息“{token:'whatever'}”,服务器和客户端只是以 5 秒的延迟回显。客户端应该有一个超时时间为 10 秒的计时器,每次收到消息时停止,每次回显消息时启动,如果计时器触发,则可以认为连接已断开。

    【讨论】:

      【解决方案2】:

      虽然实现与 uWSGI 相同的 RFC 的浏览器应该能够可靠地检测到服务器何时干净地关闭连接,但它们不会检测到连接中途中断的时间 (half open connections)t。因此,据我了解,我们应该采用额外的机制,例如应用程序级别的 ping。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-04-14
        • 2020-01-15
        • 1970-01-01
        • 2012-05-17
        • 2013-04-17
        • 2021-02-21
        • 2020-08-27
        • 2015-11-21
        相关资源
        最近更新 更多