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

如何使用WebSocket Resource Id关闭已建立的对应WebSocket连接?

WebSocket指定活跃连接关闭方案

问题根因

你现有代码的核心问题是:每次执行new WebSocket()都会创建一个全新的连接实例,和你已经存在的历史活跃连接没有关联,自然无法关闭目标连接。你需要提前把所有已创建的活跃连接实例统一存储,后续操作时直接取出对应实例执行关闭即可。

实现步骤

  1. 声明全局的连接映射表,用你持有的Resource Id作为键,对应的WebSocket实例作为值存储
  2. 所有连接在初始化创建时就存入该映射表,避免重复创建
  3. 点击Unlock按钮时,传入对应连接的Resource Id,从映射表中取出目标实例执行关闭操作

参考代码

// 全局活跃连接映射表
const activeSocketMap = new Map()

// 初始化连接的方法,连接创建时调用
function createSocket(resourceId, wsAddress) {
  // 避免重复创建同Resource Id的连接
  if (activeSocketMap.has(resourceId)) return
  const socket = new WebSocket(wsAddress)
  socket.onopen = () => {
    console.log(`连接${resourceId}已建立`)
  }
  // 连接自然关闭时自动从映射表移除
  socket.onclose = () => {
    activeSocketMap.delete(resourceId)
    console.log(`连接${resourceId}已断开`)
  }
  socket.onerror = (err) => {
    console.error(`连接${resourceId}出错`, err)
  }
  // 存入映射表
  activeSocketMap.set(resourceId, socket)
}

// Unlock按钮点击触发的关闭方法
function closeTargetSocket(resourceId) {
  if (!activeSocketMap.has(resourceId)) {
    console.log(`未找到${resourceId}对应的活跃连接`)
    return
  }
  const targetSocket = activeSocketMap.get(resourceId)
  // 重写onclose逻辑避免冲突
  targetSocket.onclose = () => {
    activeSocketMap.delete(resourceId)
    console.log(`连接${resourceId}已手动关闭`)
  }
  targetSocket.close()
}

使用示例

初始化连接时调用:

createSocket('CP0002', 'ws://localhost:6001/ocpp/CP0002')

Unlock按钮绑定逻辑:

<button onclick="closeTargetSocket('CP0002')">Unlock</button>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 08:54:05