Socket.IO - 如何在客户端更改超时值选项?

时间:2015-09-04 04:46:56

标签: javascript node.js socket.io

我使用 Socket.IO 0.9.16建立连接:

io.connect(url)

但是,当服务器死机时,检测服务器错误需要2分钟的超时时间。

我已经尝试通过设置:

将超时减少到5秒
io.connect(url, {'timeout': 5000, 'connect_timeout': 5000})

但没有成功......我怎么能这样做?

2 个答案:

答案 0 :(得分:9)

这里面临的挑战是,有许多不同的设置可以相互交互,还有一些重试逻辑会使socket.io超时不是您通常所期望的。我应该补充一点,我熟悉socket.io 1.0+,而不是0.9虽然这可能适用于两者。

让我们回顾一下socket.io连接是如何工作的。

  1. 尝试进行初始连接。
  2. 如果成功,那么您已完成连接。
  3. 如果该连接尝试未立即返回,它将等待您在连接结果的初始选项中传递的timeout值。
  4. 如果您的服务器已关闭,则连接尝试可能会很快失败。这将产生connect_error,如果您使用socket.on('connect_error', function() {...});在套接字上注册该消息,您将看到connect_error事件。
  5. connect_error不是超时。因此,如果连接快速失败(通常在服务器刚刚关闭时失败),那么您永远不会获得常规超时,并且传递给io({timeout: 5000})的超时参数确实无法生效。只有当与服务器的连接花费很长时间(例如过于繁忙的服务器或接受TCP连接的服务器,但响应速度很慢)时才会生效。当服务器刚刚关闭或无法访问时,通常不会发生这种情况。
  6. 因此,在socket.io获得connect_error后,它会标记此socket.io连接以进行重试。
  7. 重试之前的延迟基于一大堆事情。据推测,reconnectionDelay选项是公式的一部分,但在查看代码时,还有一个退避算法,它会延长重试之间的时间,重试的次数也会增加。因此,可以说,有一些算法在重试之前计算给定的延迟,每次重试都会有所不同。
  8. 然后,在计算出的延迟之后,它再次尝试连接。这基本上重复了从步骤1开始的过程。
  9. 我可以告诉他,默认情况下它会永远重试。您可以通过reconnectionAttempts选项来指定重新连接尝试的最大次数。如果您没有通过,则默认为无限。但是,如果你通过10,那么它会在连续10次连接失败后放弃。
  10. 如果您指定reconnectionAttempts,那么在多次连接尝试失败之后,您将在套接字上收到reconnect_failed事件,它将放弃。
  11. 最好的我可以告诉你,在你寻找连接的地方,尝试重试,然后在x时间后放弃的方式没有传统的超时。 timeout选项仅适用于单次重新连接尝试,而不适用于它一直尝试连接的总时间。
  12. 在我尝试过的示例测试页面中,我能够实现我自己的传统连接超时,如下所示:

    var socket = io(...);
    
    // set connect timer to 5 seconds
    socket._connectTimer = setTimeout(function() {
        socket.close();
    }, 5000);
    
    socket.on('connect', function() {
        // socket connected successfully, clear the timer
        clearTimeout(socket._connectTimer);
    });
    

    无论连接尝试进行多长时间或在该时间段内发生多次重新连接尝试,这将成功连接最多等待5秒。没有成功连接5秒后,它会关闭插座。

    在我的测试应用程序中,我可以看到socket.io一遍又一遍地重试连接,直到5秒后,我的计时器触发,我收到"timeout"的通知,然后关闭套接字并停止尝试再试一次。

答案 1 :(得分:0)

我认为是connect timeout

io.connect(url, {'timeout':5000, 'connect timeout': 5000})