Socket.io:IE仅触发一次重新连接事件

时间:2013-07-19 01:55:44

标签: node.js internet-explorer sockets socket.io reconnect

我有一个运行正常的node.js / socket.io应用程序。每次客户端失去连接时,它都会尝试使用socket.io预定义进程重新连接:

var io = io.connect("/", {
    'reconnect': true,
    'reconnection delay': 1000,
    'reconnection limit': 5000,
    'max reconnection attempts': 100
});

这适用于除Internet Explorer之外的所有浏览器。我在所有重新连接事件上添加了一些警报,以检查问题所在:

io.on('disconnect', function(){ alert('Disconnected!'); });
io.on('reconnect_failed', function(){ alert('FAILED'); });
io.on('reconnect', function(){ alert('OK'); });
io.on('reconnecting', function( nextRetry ){ alert('Reconnecting...'); });

当我停止socket.io服务器(或客户端连接丢失)时,所有客户端都会收到“on disconnect”消息。没问题。

IE以外的客户

  

所有客户每隔5秒钟就会收到“重新连接...”消息   直到连接恢复,如果是,他们会得到最后的OK消息。

拥有IE的客户

  

如果IE尝试重新连接时服务器仍处于关闭状态(第一个   时间),客户端不会继续尝试重新连接,甚至何时   服务器再次启动用户永远不会连接,直到刷新   页。由于断开事件,客户端获得“重新连接...”   消息只有一次。

正如加号测试一样,如果在IE客户端尝试重新连接之前恢复服务器,则客户端会重新连接成功。

我在这里发现了这个问题:https://github.com/LearnBoost/socket.io/issues/1020。但他们没有找到解决方案。我以dinamically方式提供socket.io.js文件,所以我不能按照他们建议的方式对其进行编辑。

谢谢!

1 个答案:

答案 0 :(得分:0)

这是我解决socket.io 0.9.6 / ie8:

这个问题的方法
  var _socket = io.connect();
  ...
  _socket.on('disconnect', function(){
      var interval = setInterval(function () {
          if (_socket.socket.connected) {
              clearInterval(interval);
          } else {
              _socket.socket.disconnect();
              _socket.socket.reconnect();
          }
      }, 31000);
  });

插入到文档中的先前jsonp脚本需要31秒间隔才能超时,当服务器可用时,会触发其他多个连接事件(多个套接字连接)。