原生websocket简单介绍

文章目录

websocket

用于客户端与服务端双向通信的工具


使用

javascript 复制代码
//node
const ws = require('ws');
const app = express();
app.use(cors());
const server = http.createServer(app);
const wss = new ws.Server({ server });

wss.on('connection', (ws) => {
  //初始化
  cilentInit(ws);
  //事件处理
  ws.on('message', (data) => {
    solveMessage(ws, data);
  });
  //结束
  ws.on('close', () => {
    cilentLeave(ws);
  });
});

//web建立连接
ws = new WebSocket(url)
//发送消息
ws.send(data)

原生websocket仅提供了较为简单的机制(如下)

typescript 复制代码
// 1. 连接成功
ws.onopen = () => ws.send('hello')

// 2. 收到消息
ws.onmessage = (e) => console.log(e.data)

// 3. 异常
ws.onerror = (e) => console.error(e)

// 4. 关闭
ws.onclose = (e) => console.log('code=', e.code)

其中前半部分是事件,后面是执行的动作

ws.send主动向服务器发送数据

问题

  1. 原生api发送数据没有timesetoutpromise等,即发送数据后想要等待服务器消息的机制,与超时等需要自己实现
  2. 需要手动对发送的消息进行分类如使用type参数

简单封装

  1. 实现异步机制
  2. 能够分发事件监听与随时去除
typescript 复制代码
private pendingPromises = new Map<string, { resolve: Function; reject: Function }>()

waitForMessage(type: string, timeout = 10000): Promise<any> {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      this.pendingPromises.delete(type)
      reject(new Error(`等待消息类型 "${type}" 超时`))
    }, timeout)
    this.pendingPromises.set(type, { resolve: (data) => { clearTimeout(timer); resolve(data) }, reject })
  })
}
相关推荐
寻星探路13 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
王达舒199413 小时前
HTTP vs HTTPS: 终极解析,保护你的数据究竟有多重要?
网络协议·http·https
朱皮皮呀13 小时前
HTTPS的工作过程
网络协议·http·https
Binary-Jeff14 小时前
一文读懂 HTTPS 协议及其工作流程
网络协议·web安全·http·https
盟接之桥17 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
会员源码网17 小时前
理财源码开发:单语言深耕还是多语言融合?看完这篇不踩坑
网络·个人开发
米羊12118 小时前
已有安全措施确认(上)
大数据·网络
ManThink Technology19 小时前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
珠海西格电力科技20 小时前
微电网能量平衡理论的实现条件在不同场景下有哪些差异?
运维·服务器·网络·人工智能·云计算·智慧城市
默默前行的虫虫20 小时前
解决EMQX WebSocket连接不稳定及优化WS配置提升稳定性?
websocket