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})
答
这里的挑战是,有一堆与对方和一些重试逻辑,所有做出socket.io超时不是你通常会互动不同的设置期望。我应该补充说我熟悉socket.io 1.0+,而不是0.9,尽管这可能适用于两者。
让我们回顾一下socket.io连接的工作原理。
- 它尝试进行初始连接。
- 如果成功,则完成连接。
- 如果连接尝试没有立即返回,它将等待您在连接结果的初始选项中传递的值
timeout
。 - 如果您的服务器关闭,连接尝试可能会很快失败。这将导致
connect_error
,如果您在socket.on('connect_error', function() {...});
的套接字上注册该消息,您将看到该事件为connect_error
。 - 这个
connect_error
不是超时。所以,如果连接快速失败(当服务器刚刚关闭时通常会发生这种情况),那么您永远不会收到常规超时,并且您传递给io({timeout: 5000})
的超时参数确实不会生效。这只有在与服务器的连接需要很长时间时才会生效(例如过于繁忙的服务器或接受TCP连接的服务器,但响应速度非常慢)。这通常不会发生在服务器刚刚关闭或无法访问时发生的情况。 - 因此,在socket.io获得
connect_error
之后,它会将此socket.io连接标记为重试。 - 重试前的延迟基于一大堆事情。据推测,
reconnectionDelay
选项是公式的一部分,但在查看代码时,还有一种退避算法,可延长重试之间的时间,并重试更多次。因此,足以说,有一些算法可以在重试之前计算给定的延迟,每次重试都会有所不同。 - 然后,在计算出延迟后,它会再次尝试连接。这基本上重复了从步骤1开始的过程。
- 尽我所知,默认情况下它会一直重试。有一个选项可以通过
reconnectionAttempts
指定重新连接尝试的最大次数。如果你不通过它,这个默认值为无穷大。但是,如果您通过10
,那么它会在连续10次连接失败后放弃。 - 如果指定
reconnectionAttempts
,那么在连接尝试失败之后,您将在套接字上获得reconnect_failed
事件,并且它将放弃。 - 尽我所知,没有传统的超时方式,你正在寻找它将连接的位置,尝试一些重试,然后在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"
的通知,并关闭套接字,并停止尝试重试任何更多。
我已经检查过它。它仍然不能更改默认超时值 – Binh