feng xiaohan

WebSocket

是一种在单个 TCP 连接上进行全双工通信的网络协议。HTML5 的新特性,实现客户端和服务端相互之间的实时通信。

相比于 HTTP 协议的请求,使用 WebSocket 可以建立持久的连接,允许服务器主动向客户端推送数据,避免不必要的轮询请求,提高了实时性和效率。

使用场景

  • 实时性要求比较高的应用:比如在线聊天,游戏,数据可视化等。
  • 需要频繁交换数据的应用:在线编辑器,文档管理器等。
  • 需要推送服务的应用:比如实时数据监控、通知系统等。
  • 跨平台应用:比如桌面应用程序、移动应用程序等。

使用

后端

node

  • 安装 ws 和其声明文件。
  • 新建一个 WebSocket 的服务(ws.Server)。
  • 监听客户端的连接。

默认是使用点对点的方式,可以修改为广播的方式,让连接到这个 socket 的客户端都能通过服务端的广播消息,收到对方客户端的消息。(群聊)

  • 遍历 clients,获取每一个连接上的 client,发送消息。

前端

  • 构造一个 WebSocket 的实例,该实例需要传入一个用于建立连接的 url,以 ws 或 wss 开头(不用 http/https)。
  • 在这个实例对象上监听 open()。

发送消息前后端都使用 send(),接收消息默认监听 message 事件。

心跳检测

在实际使用过程中,由干网络波动、弱信号等原因,可能会导 WebSocket 连接断开。为了避免这种请求,可以通过心跳检测机制来检测 WebSocket 连接是否正常,当发现连接断开时尝试重连。

心跳自定义的。

const state = {
  HEART: 1,
  MESSAGE: 2,
};
// ...
let heartInreaval = null;
const heartCheck = () => {
  if (socket.readyState === ws.OPEN) {
    // socket.send("ping");
    socket.send(
      JSON.stringify({
        type: state.HEART,
        message: "心跳检测",
      })
    );
  } else {
    clearInterval(heartInreaval);
  }
};
heartInreaval = setInterval(heartCheck, 5000);