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

Node.js Socket Cluster如何通过Socket ID获取并断开指定客户端连接

通过Socket ID断开Socket Cluster指定客户端连接的解决方案

我刚好有过用Socket Cluster处理这类客户端连接管理的经验,给你一步步拆解实现方法:

1. 获取服务器上所有已连接的Socket

Socket Cluster的服务器实例(通常命名为socketClusterServer)自带了一个connectedSockets对象,这个对象以socket ID为键,对应的socket实例为值,直接就能获取到当前进程内所有在线的客户端连接。

2. 根据Socket ID断开目标连接

拿到目标socket ID后,你只需要从connectedSockets中取出对应的socket实例,调用它的disconnect()方法即可。如果需要强制关闭底层TCP连接(避免客户端重连延迟),可以给方法传true参数。

单进程模式下的代码示例

// 假设你的Socket Cluster服务器实例是socketClusterServer
// 在接收目标socketId的监听器中
socketClusterServer.on('disconnect-target-client', (socketId) => {
  // 获取目标socket实例
  const targetSocket = socketClusterServer.connectedSockets[socketId];

  if (targetSocket) {
    // 强制断开连接
    targetSocket.disconnect(true);
    console.log(`已成功断开socket ID为 ${socketId} 的客户端连接`);
  } else {
    console.log(`未找到socket ID为 ${socketId} 的在线客户端`);
  }
});

3. 多进程模式下的注意事项

如果你的Socket Cluster用了多worker进程(通过workerController配置),每个worker进程的connectedSockets只存储当前进程下的客户端连接。这时候如果目标socket不在当前worker,你需要通过进程间通信来通知对应worker执行断开操作:

多进程模式代码示例

// 在接收socketId的worker进程中,广播断开指令到所有worker
socketClusterServer.exchange.publish('trigger-disconnect', socketId);

// 在每个worker的初始化代码中监听该指令
socketClusterServer.exchange.subscribe('trigger-disconnect', (socketId) => {
  const targetSocket = socketClusterServer.connectedSockets[socketId];
  if (targetSocket) {
    targetSocket.disconnect(true);
    console.log(`Worker ${process.pid} 已断开socket ID为 ${socketId} 的连接`);
  }
});

额外提示

  • 确保你传递的socket ID是正确的:客户端的socket ID可以通过客户端代码的socket.id获取,传递到服务器时要避免拼写或格式错误。
  • disconnect()方法默认会让客户端触发disconnect事件,如果你需要自定义断开原因,可以在断开前给客户端发送一个自定义事件通知。

内容的提问来源于stack exchange,提问作者Vijay Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:25:10