socket.io xhr-polling disconnect事件

时间:2013-08-01 06:59:13

标签: node.js websocket socket.io

我有一个socket.io节点脚本:

socket.on('disconnect', function(data) {    
  console.log('disconnect!');
});

当我连接Chrome / Safari并关闭页面时,我看到“断开连接!”在我的服务器控制台中。

但是,当我连接iPhone并关闭页面时,我看不到此消息。我看到debug - xhr-polling closed due to exceeded duration

如何通过iOS接收断开事件?

1 个答案:

答案 0 :(得分:6)

当您在iPhone中查看页面时,Socket.io会切换到xhr-polling传输。这可能是由socket.io的配置引起的,或者是因为i​​Phone中的浏览器没有(完全)支持websockets。

当连接关闭时,socket.io中的xhr-polling实现不会发出disconnect事件,请参阅github issue #431。您可以通过强制socket.io服务器仅使用xhr-polling传输来在Chrome浏览器中重现此问题:

// the server side
var io = require('socket.io').listen(httpServer);
io.set('transports', ['xhr-polling']);

好消息:您可以通过打开sync disconnect on unload标志让socket.io的客户端通知服务器有关断开连接的信息:

// the browser (HTML) side
var socket = io.connect('http://localhost', {
  'sync disconnect on unload': true
});

警告:当网络和/或服务器速度较慢时,此选项可能会恶化用户体验,有关详细信息,请参阅此pull request

<强>更新

根据socket.io force a disconnect over XHR-polling,设置sync disconnect on unload可能不足以解决iPhone / iPad上的问题。

正如您在socket.io-client source code中看到的那样,sync disconnect on unloadbeforeunload事件设置了一个监听器,iOS Safari不支持该事件。

解决方案可能是修复socket.io-client来监听unloadpagehide事件,因为 卸载事件可能无法按预期进行后退和前向优化。请改用pageshow和pagehide事件。 [Apple Web Content Guide]