socket.io非活动客户端连接的服务器端超时
socket.io server-side timeout for inactive client connection?
我知道,如果socket.io客户端库没有定期接收到对发送到服务器的ping数据包的响应(假设连接由于某种原因而终止),它将关闭当前的socket.io连接(然后尝试重新连接)。而且,还有一些客户端选项用于控制这种重新连接行为。
但是,如果客户端处于非活动状态并停止发送ping消息(比如因为客户端进入睡眠状态),服务器端会发生什么?我在socket.io服务器端文档中找不到任何解释这种情况或允许对其进行配置的信息。服务器会关闭不活动的客户端socket.io连接(它没有从中接收ping消息)吗?如果是,服务器将等待多长时间?这种行为是可配置的吗?
根据socket.io 2.20自述文件(截至2020年1月的最新版本):
"心跳机制是在Engine.IO级别实现的,允许服务器和客户端知道另一方何时不再响应。
该功能通过在服务器和客户端上设置定时器来实现,在连接握手期间共享超时值(
pingInterval
和pingTimeout
参数)。"
因此,您可以通过在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});
查看此处的所有选项及其默认值
- 如何使用skip参数使用angular ui引导进行服务器端分页
- Webpack开发服务器和React服务器端渲染
- 提示使用服务器端事件处理程序激活JavaScript
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 如何轻松地将服务器端变量从Java代码转移到客户端代码
- 通过ajax将坐标传递到php服务器端,并在处理后检索到javascript
- 将表单数据提交到服务器端
- 使用ajax的服务器端分页&jQuery
- 显示具有服务器端自动时间注销的同步倒计时计时器
- 使用FormData上传AJAX图像;t在服务器端显示图像
- React路由器服务器端渲染和ajax获取数据
- renderReact/Rect Router+Node/Express.js的服务器端/同构渲染中未定义renderP
- Meteor如何运行服务器端python脚本
- CORS-服务器端cookie没有保存在chrome浏览器上
- 加载服务器端渲染的React组件后执行脚本
- 在Javascript中复制C#服务器端验证
- 在javascript或服务器端处理会话超时
- 处理Datatables中的会话超时(使用服务器端数据源处理)
- 我在客户端和服务器端都实现了xdomain脚本,但在IE9中不断获得'超时等待iframe套接字'警告
- socket.io非活动客户端连接的服务器端超时