【问题标题】:Socket.IO - How to change timeout value option on client side?Socket.IO - 如何在客户端更改超时值选项?
【发布时间】:2015-11-30 03:39:35
【问题描述】:

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

io.connect(url)

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

我已经尝试通过设置将超时时间减少到 5 秒:

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

但没有成功...我该怎么做?

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    这里的挑战是,有许多不同的设置相互交互,以及一些重试逻辑,所有这些都会使 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 选项仅适用于一次重新连接尝试,而不适用于它一直尝试连接的总时间。

    在我一直在试验的示例测试页面中,我能够像这样实现自己的传统连接超时:

    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" 的通知,我关闭了套接字,它停止尝试重试没有了。

    【讨论】:

    • 是的,感谢您的回答,jfriend00。我完全同意你的意见。现在,我有另一个解决这个问题的方法是:创建超时来检查 socket.socket.connected 值。
    • @Binh - 因为看起来你是 StackOverflow 的新手,你知道如果你的问题得到了回答,你可以通过选中左侧的绿色复选标记来向社区表明这一点答案。这将为您和提供答案的人赢得一些声誉积分,从而在网站上获得更多特权。
    【解决方案2】:

    我认为是connect timeout

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

    【讨论】:

    • 我已经检查过了。它仍然无法更改默认超时值
    猜你喜欢
    • 2013-12-31
    • 2020-03-02
    • 1970-01-01
    • 2019-04-15
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 1970-01-01
    相关资源
    最近更新 更多