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

socket.io server-side timeout for inactive client connection?

本文关键字:服务器端 超时 连接 客户端 io 非活动 socket      更新时间:2023-09-26

我知道,如果socket.io客户端库没有定期接收到对发送到服务器的ping数据包的响应(假设连接由于某种原因而终止),它将关闭当前的socket.io连接(然后尝试重新连接)。而且,还有一些客户端选项用于控制这种重新连接行为。

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

根据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);

断开检测

以下情况下,Engine.IO连接被视为关闭:

  • 一个HTTP请求(GET或POST)失败(例如,当服务器关闭时)
  • WebSocket连接关闭(例如,当用户关闭浏览器中的选项卡时)
  • socket.disconnect()在服务器端或客户端调用还有一种检测信号机制,用于检查服务器和客户端之间的连接是否仍在运行:

在给定的间隔(握手中发送的pingInterval值),服务器发送一个PING数据包,客户端有几秒钟的时间(pingTimeout值)将PONG数据包发回。如果服务器没有接收到返回的PONG数据包,则它将认为连接已关闭。相反,如果客户端在pingInterval+pingTimeout内没有接收到PING数据包,则会认为连接已关闭。

此处(服务器端)和此处(客户端)列出了断开连接的原因。

pingTimeout(Number):在没有pong数据包的情况下,考虑关闭连接的毫秒数(60000)

pingInterval(Number):发送新的ping数据包(25000)之前的毫秒数

https://socket.io/docs/v4/server-api/

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

在socket.io 2.20上。这可以在初始化socket.io 时设置

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

查看此处的所有选项及其默认值