Skip to content

WebSocket

一种在 Web 应用程序中实现实时通信的技术,它允许浏览器和服务器之间创建持久性的连接,以便可以进行双向数据传输。

应用场景

  • 即时聊天
  • 实时游戏

install

bash
npm install ws

npm install @types/ws -D

协议 ws:// wss;// 类似 http:// https://

API

API描述
open连接建立成功时触发的事件
message接收到来自服务器的消息时触发的事件
send向服务器发送消息
close连接关闭时触发的事件
error发生错误时触发的事件
js
// 创建 WebSocket 实例
let ws = new WebSocket("ws://localhost:8080");

// 监听 WebSocket 连接建立事件
ws.addEventListener("open", () => {
  console.log("WebSocket连接已建立");
});

// 监听 WebSocket 接收消息事件
ws.addEventListener("message", (event) => {
  console.log("收到服务器消息: " + event.data);
});

// 监听 WebSocket 连接关闭事件
ws.addEventListener("close", (event) => {
  if (event.wasClean) {
    console.log("WebSocket连接已关闭");
  } else {
    console.error("WebSocket连接断开"); // 通常发生错误时触发
  }
});

// 监听 WebSocket 发生错误事件
ws.addEventListener("error", (error) => {
  console.error("WebSocket发生错误: " + error.message);
});

// 发送消息给服务器
ws.send("Hello Server!");

心跳检测 保活

后端 socket.readystate == ws.OPEN

js
// 心跳检测
let heartInterval = setInterval(() => {
  //  OPEN 状态
  if (socket.readystate == ws.OPEN) {
    socket.send(
      JSON.stringify({
        type: state.heart,
        message: "心跳检测",
      })
    );
  } else {
    clearInterval(heartInterval);
  }
}, 3000);

example

js
// 创建 WebSocket
// 协议 ws:// wss;// 类似 http:// https://
const ws = new WebSocket("ws://localhost:8080");

ws.addEventListener("open", () => {
  console.log("连接成功");
});
ws.onopen = function (event) {
  console.log("WebSocket连接已建立");
};

let input = document.querySelector("input");
const handler = () => {
  if (input.value.length > 0) {
    // 发送消息
    ws.send(input.value);
    input.value = null;
  }
};

// 接受 服务端返回的消息
ws.onmessage = (event) => {
  console.log("接收到服务器返回消息:", event.data);
  let li = document.createElement("li");
  const data = JSON.parse(event.data);
  if (data.type == 2) {
    li.innerHTML = data.message;
    document.querySelector("ul").appendChild(li);
  }
};
js
const WebSocket = require("ws");

const ws = new WebSocket.Server({ port: 8080 }, () => {
  console.log("WebSocket服务启动成功,端口8080");
});

const state = {
  heart: 1,
  message: 2,
};

ws.on("connection", (socket) => {
  console.log("连接成功");

  socket.on("message", (message) => {
    console.log("服务端收到客户端的消息:", message.toString());

    // 广播消息给所有客户端
    ws.clients.forEach((client) => {
      if (client.readyState === WebSocket.OPEN) {
        client.send(
          JSON.stringify({
            type: state.message,
            message: message.toString(),
          })
        );
      }
    });
  });

  // 心跳检测
  let heartInterval = setInterval(() => {
    if (socket.readyState === WebSocket.OPEN) {
      socket.send(
        JSON.stringify({
          type: state.heart,
          message: "心跳检测",
        })
      );
    } else {
      clearInterval(heartInterval);
    }
  }, 3000);

  // 连接关闭时清除心跳检测定时器
  socket.on("close", () => {
    clearInterval(heartInterval);
  });
});

Released under the MIT License.