正确closuresWebSocket(HTML5,Javascript)
我正在玩HTML5 WebSockets。 我想知道,如何优雅地closures连接? 就像,如果用户刷新页面,或只是closures浏览器会发生什么?
当用户只是刷新页面而不调用websocket.close()
– 当它们在刷新之后返回时,它会碰到websocket.onclose
事件,这是一个奇怪的行为。
根据协议规范 v76(这是目前支持的浏览器版本):
为了清楚地closures连接,从一个对等体发送一个只包含0xFF字节和一个0x00字节的帧,要求另一个对等体closures连接。
如果您正在编写服务器,则应确保在服务器closures客户端连接时发送closures帧。 正常的TCP套接字closures方法有时会很慢,导致应用程序认为连接仍然打开,即使没有。
当您closures或重新加载页面时,浏览器应该为您做这些事情。 但是,可以通过捕获beforeunload事件来确保发送closures帧:
window.onbeforeunload = function() { websocket.onclose = function () {}; // disable onclose handler first websocket.close() };
我不确定在刷新页面后如何获得onclose事件。 一旦页面重新加载,websocket对象(使用onclose处理程序)将不再存在。 如果您在页面加载时立即尝试在您的页面上build立WebSocket连接,那么您可能会遇到服务器在旧连接断开后很快拒绝新连接的问题(或者浏览器尚未就绪在你尝试连接的地方build立连接),你得到一个新的websocket对象的onclose事件。
事情就是今天有两个主要的WebSocket协议版本。 使用[0x00][message][0xFF]
协议的旧版本,然后是使用Hybi格式化数据包的新版本。
Opera和iPod / iPad / iPhone使用旧的协议版本,因此在WebSockets服务器中实现向后兼容性实际上非常重要。 在这些使用旧协议的浏览器中,我发现刷新页面或从页面导航或closures浏览器都会导致浏览器自动closures连接。 大!!
但是,对于使用新协议版本的浏览器(例如Firefox,Chrome和IE10),只有closures浏览器才会导致浏览器自动closures连接。 也就是说,如果刷新页面或离开页面,浏览器不会自动closures连接。 然而,浏览器做的是发送一个hybi数据包到服务器,第一个字节(proto ident)是0x88
(更好的称为closuresdataframe)。 一旦服务器收到这个数据包,它可以强制closures连接本身,如果你愿意的话。
很简单,你closures它:)
var myWebSocket = new WebSocket("ws://example.org"); myWebSocket.send("Hello Web Sockets!"); myWebSocket.close();
你还检查下面的网站吗?查看Opera的介绍文章
正如上面提到的,一些浏览器不会自动closureswebsocket。 不要试图处理客户端的任何“closures浏览器窗口”事件。 目前还没有可靠的方法来做到这一点,如果你考虑支持主要的桌面和移动浏览器(例如onbeforeunload
将无法在移动Safari浏览器中工作)。 我有处理服务器端的这个问题的经验。 例如,如果您使用Java EE,请查看javax.websocket.Endpoint ,具体取决于浏览器,如果closures/重新加载浏览器窗口,则将调用OnClose
方法或OnError
方法。