0

我有一个运行良好的 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 服务器(或客户端连接丢失)时,所有客户端都会收到“断开连接”消息。没问题。

使用非 IE 的客户端

所有客户端每 5 秒不断收到“重新连接...”消息,直到连接恢复,如果是,他们会收到最终的 OK 消息。

使用 IE 的客户

如果在 IE 尝试重新连接(第一次)时服务器仍然处于关闭状态,则客户端不会继续尝试重新连接,即使服务器再次启动,用户也永远不会连接,直到刷新页面。由于断开事件,客户端只收到一次“重新连接...”消息。

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

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

谢谢!

4

1 回答 1

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 秒的时间间隔才能超时,否则当服务器可用时会触发多个连接事件(连接多个套接字)。

于 2014-11-26T16:43:06.863 回答