You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 20:36:06