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

问题描述:

我用Socket.IO 0.9.16建立连接:Socket.IO - 如何更改客户端的超时值选项?

io.connect(url) 

然而,当服务器死亡,它需要2分钟超时检测误差与服务器。

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

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

但没有成功......我怎样才能做到这一点?

我认为这是connect timeout

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

我已经检查过它。它仍然不能更改默认超时值 – Binh

这里的挑战是,有一堆与对方和一些重试逻辑,所有做出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"的通知,并关闭套接字,并停止尝试重试任何更多。

+0

是的,谢谢你的回答,[标签:jfriend00]。我完全赞同你的意见。而现在,我对这个问题有另一个解决方法是:创建超时来检查socket.socket.connected值。 – Binh

+0

@Binh - 因为你看起来像*中的新手,你是否知道如果你的问题得到解答,你可以通过选中答案左边的绿色复选标记来向社区指出。这将为您和提供答案的人提供一些可以在网站上获得更多权限的声望点。 – jfriend00