我使用 Socket.IO 0.9.16建立连接:
io.connect(url)
但是,当服务器死机时,检测服务器错误需要2分钟的超时时间。
我已经尝试通过设置:
将超时减少到5秒io.connect(url, {'timeout': 5000, 'connect_timeout': 5000})
但没有成功......我怎么能这样做?
答案 0 :(得分:9)
这里面临的挑战是,有许多不同的设置可以相互交互,还有一些重试逻辑会使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连接的服务器,但响应速度很慢)时才会生效。当服务器刚刚关闭或无法访问时,通常不会发生这种情况。connect_error
后,它会标记此socket.io连接以进行重试。reconnectionDelay
选项是公式的一部分,但在查看代码时,还有一个退避算法,它会延长重试之间的时间,重试的次数也会增加。因此,可以说,有一些算法在重试之前计算给定的延迟,每次重试都会有所不同。reconnectionAttempts
选项来指定重新连接尝试的最大次数。如果您没有通过,则默认为无限。但是,如果你通过10
,那么它会在连续10次连接失败后放弃。reconnectionAttempts
,那么在多次连接尝试失败之后,您将在套接字上收到reconnect_failed
事件,它将放弃。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"
的通知,然后关闭套接字并停止尝试再试一次。
答案 1 :(得分:0)
我认为是connect timeout
io.connect(url, {'timeout':5000, 'connect timeout': 5000})