我正在使用uwsgi的websockets支持,到目前为止,它看起来很棒,服务器可以检测客户端何时断开连接,客户端也可以检测服务器何时停机。但我担心这不会适用于所有情况/浏览器。
在其他框架(即sockjs)中,通过发送作为心跳/ping的常规消息来监控连接。但是uwsgi根据websockets规范发送PING/PONG帧(即不是常规消息/控制帧),因此从客户端我无法知道最后一次PING是何时从服务器接收的。所以我的问题是:
如果连接被某些代理断开或阻止,浏览器(如Chrome、ie、Firefox、Opera)是否会可靠地检测到没有从服务器接收到PING并发出连接关闭的信号,或者我是否应该实现一些额外的乒乓系统,以便从客户端检测到连接关闭?
感谢
你完全是对的。客户端无法跟踪或发送ping/pong。因此,如果连接断开,服务器可以通过乒乓球检测到这种情况,但客户端被挂起。。。直到它试图发送一些东西并且底层TCP机制检测到另一方没有确认其分组。
因此,如果客户端应用程序希望大部分时间都在"监听",那么实现一个"双向"工作的保持活跃系统可能会很方便,正如Stephen在您发布的链接中所解释的那样。但是,这个保持活跃的系统将是应用层的一部分,而不是作为ping/pong的传输层的一部份。
例如,您可以有一条消息"{token:'watever'}",服务器和客户端只会延迟5秒进行响应。客户端应该有一个超时为10秒的计时器,每次接收到消息时都会停止,每次响应消息时就会启动,如果计时器触发,则可以认为连接已断开。
尽管实现与uWSGI相同RFC的浏览器应该可靠地检测服务器何时干净地关闭连接,但它们不会检测连接何时中途中断(半开放连接)t。因此,据我所知,我们应该使用一种额外的机制,比如应用程序级的ping。