如何关闭闲置的Socket.IO连接?是否需客户端自行追踪?(v4.4.1)
Socket.IO 4.4.1 闲置连接关闭方案
不用客户端自行追踪,服务端直接就能配置关闭闲置连接,主要有两种实用方式:
1. 利用内置心跳机制自动断开
Socket.IO 4.4.1 自带 ping/pong 心跳检测机制,通过配置两个核心参数,就能让服务端自动断开长时间无响应的闲置连接:
pingInterval:服务端主动发送 ping 包的间隔(单位:毫秒),默认值 25000pingTimeout:服务端发送 ping 包后,超过该时长未收到客户端 pong 响应,就会触发断开逻辑(单位:毫秒),默认值 5000
示例代码(Node.js 服务端):
const { Server } = require("socket.io"); const io = new Server({ pingInterval: 30000, // 每30秒发送一次ping包 pingTimeout: 10000 // 10秒未收到pong就断开连接 });
2. 自定义闲置检测逻辑
如果需要更灵活的闲置判断规则(比如根据特定业务事件判定是否闲置),可以在服务端手动实现定时器逻辑:
- 客户端每次发送事件时,重置闲置定时器
- 超时后主动调用
socket.disconnect()断开连接
示例代码:
io.on("connection", (socket) => { let idleTimer; // 重置闲置定时器的工具函数 const resetIdleTimer = () => { clearTimeout(idleTimer); // 设置10分钟无事件触发就断开连接 idleTimer = setTimeout(() => { socket.disconnect(true); }, 600000); }; // 监听客户端所有事件,触发时重置定时器 socket.onAny(resetIdleTimer); // 连接建立时初始化定时器 resetIdleTimer(); // 连接断开时清理定时器,避免内存泄漏 socket.on("disconnect", () => { clearTimeout(idleTimer); }); });
客户端也可以主动在闲置状态下调用 socket.disconnect(),但服务端控制的方式更可靠,能有效避免客户端异常退出导致的无效连接残留。
内容的提问来源于stack exchange,提问作者Sanjay Singh
相关产品推荐
相关产品推荐

