如何在socket.io中配置重新连接?

33

我使用以下代码创建了socket.io连接

var socket = new io.connect('http://localhost:8181', {
    'reconnect': true,
    'reconnection delay': 500,
    'max reconnection attempts': 50
});

但是当我通过 CTRL+C 来停止服务器,然后重新启动时,客户端并没有重新连接。不过客户端确实触发了断开连接事件(disconnect event)。这可能的原因是什么呢?


使用默认选项,当我重新启动服务器时,Socket.IO 几乎立即重新连接。你尝试过不设置任何选项然后看看会发生什么吗? - Brad
我尝试不设置任何选项,但重新连接没有发生。 - Dmitro
4个回答

37

这是一个旧问题,但对于像我这样正在寻找如何在 socket.io (1.x) 中配置重新连接的其他人,这是正确的语法:

这是一个老问题,但对于像我一样正在寻找如何在 socket.io (1.x) 中配置重新连接的其他人,以下是正确的语法:

var socket = new io.connect('http://localhost:8181', {
    'reconnection': true,
    'reconnectionDelay': 1000,
    'reconnectionDelayMax' : 5000,
    'reconnectionAttempts': 5
});

11

这是一个老问题,但当我使用v1.4.5时(出于不同的原因),我也有同样的问题。我的聊天室应用程序工作得非常好,但是当我在终端中按下Ctrl+C时,我的浏览器继续循环并报告 ERR_CONNECTION_REFUSED 错误,每隔几秒钟一次,直到关闭它。

稍微修改之前的答案就给了我解决方案。

对于v1.4.5,在客户端js文件中,“var socket”的原始代码如下:

    var socket = io();

这里是解决方案:

    var socket = io({
        'reconnection': true,
        'reconnectionDelay': 1000,
        'reconnectionDelayMax' : 5000,
        'reconnectionAttempts': 5
    });

显然,如果我愿意的话,我可以更改这些值,但重要的是,这个操作杀掉了永远不断的重新连接请求。


我遇到了相同的问题,即每隔一秒钟就会出现ERR_CONNECTION_REFUSED。您能告诉我是否有任何事件在客户端重新连接尝试达到reconnectionAttempts:5时生成吗?我想在连接尝试次数达到一定数量后向客户端显示一条消息,提示连接未建立。 - user526206
这个功能没有内置。您需要自己创建一个警报,在指定的重新连接尝试次数之后触发它。 - elmeltone
我得到了答案,事件名称为“reconnect_failed”,在x次尝试失败后会触发。(https://github.com/socketio/socket.io-client/issues/705) - user526206

11

我知道这是一个老问题,但我一直在处理socket io重新连接的问题,并在搜索结果中找到了这篇文章,所以想做出贡献。尝试使用以下代码调试确切哪些事件正在触发:

# coffeescript. compile if you're writing javascript, obviously.

socket.on 'connect',-> console.log 'connected'
socket.on 'reconnect',-> console.log 'reconnect'
socket.on 'connecting',-> console.log 'connecting'
socket.on 'reconnecting',-> console.log 'reconnecting'
socket.on 'connect_failed',-> console.log 'connect failed'
socket.on 'reconnect_failed',-> console.log 'reconnect failed'
socket.on 'close',-> console.log 'close'
socket.on 'disconnect',-> console.log 'disconnect'

这应该能让您更深入地了解客户端套接字的状态。此外,尝试查看您的 Web 检查器的网络选项卡,看看它是否作为后备触发 XHR 请求。最后,在您的 Web 控制台中,尝试键入 io.sockets 并展开它,以查看它是否实际上正在尝试重新连接。我遇到了 reconnect_failed 不触发和重新连接计数器不重置的问题。以下是这些问题在 GitHub 上的讨论链接。重新连接延迟 - 指数回退未正确重置重新连接失败从未触发一些潜在的修复/解决方法

0

重新连接延迟太小了,增加到500毫秒。此外,50次重试意味着500 * 50 = 25000毫秒,即25秒。如果这样还不行,在客户端的错误事件上设置超时时间以重新创建套接字对象(在错误和一些延迟后重试创建连接)。


4
在socket.io-client的文档中,我看到了这样一句话:"在我们尝试重新连接服务器之前等待的毫秒数。我们使用指数退避算法进行以下重新连接,在每次重新连接尝试中,此值将乘以一个倍数(500 > 1000 > 2000 > 4000 > 8000)",因此它将大于25000毫秒。 - Dmitro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接