我使用uwsgi的websockets支持,到目前为止看起来很棒,服务器检测客户端何时断开连接以及服务器发生故障时客户端。但我担心这不适用于所有情况/浏览器。
在其他框架(即sockjs)中,通过发送充当心跳/ ping的常规消息来监视连接。但uwsgi根据websockets规范发送PING / PONG帧(即不是常规消息/控制帧),因此从客户端我无法知道何时从服务器接收到最后一次ping。所以我的问题是:
如果连接被某些代理删除或阻止,浏览器可靠地(即Chrome,IE,Firefox,Opera)检测到没有从服务器收到PING并将连接信号告知关闭,或者我应该执行一些额外的ping / pong系统,以便从客户端检测到连接已关闭?
由于
答案 0 :(得分:2)
你完全正确。客户端无法跟踪或发送ping / pongs。因此,如果连接断开,服务器能够通过ping / pong检测到这种情况,但客户端被挂起......直到它尝试发送内容并且底层TCP机制检测到另一方未确认其数据包
因此,如果客户端应用程序希望是" listen"在大多数情况下,实现一个可以工作的保持活动系统可能很方便。"两种方式"正如Stephen Clearly在您发布的链接中解释的那样。但是,这个保持活动的系统将是应用程序层的一部分,而不是传输层的一部分作为ping / pongs。
例如,您可以收到一条消息" {令牌:'无论如何'}"服务器和客户端只有5秒的延迟回应。客户端应该有一个10秒超时的定时器,每次收到消息时都会停止,并在每次回显消息时启动,如果定时器触发,则可以考虑删除连接。
答案 1 :(得分:0)
虽然实现与uWSGI相同的RFC的浏览器应该在服务器干净地关闭连接时可靠地检测到,但它们不会检测到连接在中途(half open connections)t中断的时间。因此,根据我的理解,我们应该采用额外的机制,如应用程序级别ping。