socket.io服务器端超时的非活动客户端连接?

时间:2015-06-22 23:07:22

标签: javascript node.js socket.io

我知道socket.io客户端库将关闭当前的socket.io连接(然后尝试重新连接),如果它没有定期接收它发送给服务器的ping数据包的响应(假设连接已经因某种原因而死亡)。并且,有控制此重新连接行为的客户端选项。

但是,如果客户端变为非活动状态并停止发送ping消息(比如因为客户端进入睡眠状态),服务器端会发生什么?我在socket.io服务器端doc中找不到任何解释该情况或允许配置它的信息。服务器是否会关闭一个非活动的客户端socket.io连接(一个没有收到ping消息的连接)?如果是这样,服务器等待多长时间并且该行为是否可配置?

3 个答案:

答案 0 :(得分:4)

根据socket.io 2.20自述文件(截至2020年1月的最新版本):

“在Engine.IO级别上实现了心跳机制,使服务器和客户端都可以知道对方何时不再响应了。

该功能是通过在服务器和客户端上设置计时器并在连接握手期间共享超时值(pingIntervalpingTimeout参数)来实现的。”

因此,您可以通过在socket.io内部的engine.io组件上设置以下超时属性来配置服务器和客户端超时设置。

使用socket.io版本2.20:

const io = ...; // initialize socket.io how you wish
io.eio.pingTimeout = 120000; // 2 minutes
io.eio.pingInterval = 5000;  // 5 seconds

使用较旧版本的socket.io也是一样:

const io = ...; // initialize socket.io how you wish
io.set('heartbeat timeout', 1200000);
io.set('heartbeat interval', 5000);

答案 1 :(得分:2)

  

pingTimeout(Number):没有pong数据包的多少ms考虑连接关闭(60000)

     

pingInterval(Number):发送新ping包之前的ms(25000)

http://socket.io/docs/server-api/

https://github.com/socketio/engine.io#methods-1

答案 2 :(得分:0)

在socket.io 2.20上。可以在初始化socket.io

时设置
const io = require("socket.io")({pingTimeout: 10000, pingInterval: 30000});

查看所有选项及其默认值here