Socket.io场景下实现客户端发消息时关闭Express服务器的问题
需求
- 客户端发送消息时自动关闭Express+Socket.io服务端
- 已验证客户端请求可正常触达服务端,触发时服务端会打印日志
hit server
现有服务端代码
io.on('connection', (socket) => { console.log('this is connected'); socket.on('message', function(data){ console.log('hit server'); server.close(); }) }); io.on('error', function() { console.log('there is an error'); }) server.listen(3000, () => { console.log('listen on *:3000'); });
问题说明
原代码直接调用server.close()仅会停止监听新的连接请求,不会主动断开已经建立的Socket长连接,服务端会进入等待状态,直到所有已有连接自然断开才会完全关闭,无法达到触发后立刻关闭的效果。
修复方案
需要先手动断开所有已存在的活跃Socket连接,再执行服务关闭操作,修改后代码如下:
// 存储所有活跃的Socket连接 const activeSockets = new Set(); io.on('connection', (socket) => { console.log('this is connected'); // 新连接加入集合 activeSockets.add(socket); socket.on('message', function(data){ console.log('hit server'); // 断开所有活跃Socket activeSockets.forEach(socket => socket.disconnect(true)); activeSockets.clear(); // 关闭服务 server.close(() => { console.log('服务已完全关闭'); // 若需要直接退出进程可打开下方注释 // process.exit(0); }); }) // 连接断开时从集合中移除 socket.on('disconnect', () => { activeSockets.delete(socket); }) }); io.on('error', function() { console.log('there is an error'); }) server.listen(3000, () => { console.log('listen on *:3000'); });
内容的提问来源于stack exchange,提问作者FabricioG
相关产品推荐
相关产品推荐

