Skip to content
On this page

express-ws

javascript
const express = require("express");
const expressWs = require("express-ws");

const websocket = require("../routes/websocket");

const app = express();
expressWs(app);

app.use(express.static("public"));

app.use("/websocket", websocket);

app.ws("/socketTest", function (ws, req) {
  ws.send("你连接成功了");
  ws.on("message", function (msg) {
    console.log(msg);
  });
});

app.get("*", (req, res) => {});

app.listen(8080, () => {
  console.log("server is listening on port 8080");
});
javascript
const ws = new WebSocket('ws://127.0.0.1:3000/websocket/test')
ws.onopen = e => {
  console.log(`WebSocket 连接状态: ${ws.readyState}`)
}

ws.onmessage = data => {
  receiveBox.innerHTML += `<p>${data.data}</p>`
  receiveBox.scrollTo({
    top: receiveBox.scrollHeight,
    behavior: "smooth"
  })
}

ws.onclose = data => {
  console.log('WebSocket连接已关闭')
  console.log(data);
}

sendBtn.onclick = () => {
  ws.send(msgBox.value)
}
exit.onclick = () => {
  ws.close()
}

koa-websocket

服务端

javascript
let Koa = require("koa2");
let WebSocket = require("koa-websocket");

/* 实例化 WebSocket, 实例化储存所有上线文数组 并分配监听的端口 */
let app = WebSocket(new Koa());
let ctxs = [];
app.listen(80, () => {
  console.log("已启动:http://127.0.0.1");
});

/* 实现简单的接发消息 */
app.ws.use((ctx, next) => {
  /* 每打开一个连接就往 上线文数组中 添加一个上下文 */
  ctxs.push(ctx);
  ctx.websocket.on("message", (message) => {
    // for (let i = 0; i < ctxs.length; i++) {
    //   if (ctx == ctxs[i]) continue;
    //   ctxs[i].websocket.send(message);
    // }
    // 返回给前端的数据
    let data = JSON.stringify({
      id: Math.random() * 10,
      time: new Date(),
    });
    ctx.websocket.send(data);
    console.log("前端发来:", message);
  });
  ctx.websocket.on("close", (message) => {
    /* 连接关闭时, 清理 上下文数组, 防止报错 */
    console.log("前端断开链接");
    // let index = ctxs.indexOf(ctx);
    // ctxs.splice(index, 1);
  });
});

客户端

javascript
<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>websocket</title>
  </head>

  <body>
    <div id="sse">
      <a href="javascript:WebSocketTest()">运行 WebSocket</a>
      <input type="text" id="content" />
      <input type="button" value="发送" id="send" />
      <input type="button" value="关闭" id="close" />
    </div>
    <script>
      function WebSocketTest() {
        if ("WebSocket" in window) {
          alert("您的浏览器支持 WebSocket!");
        } else {
          alert("您的浏览器不支持 WebSocket!");
        }
      }
      /* 封装 WebSocket 实例化的方法 */
      var createWebSocket = (function () {
        return function (urlValue) {
          if (window.WebSocket) return new WebSocket(urlValue);
          if (window.MozWebSocket) return new MozWebSocket(urlValue);
          return false;
        };
      })();
      /* 实例化 WebSocket 连接对象, 地址为 ws 协议 */
      var ws = createWebSocket("ws://localhost");
      /* 接收到服务端的消息时 */
      ws.onmessage = function (msg) {
        // msg 为 MessageEvent类型,需要获取data
        console.log("服务端说:" + msg.data);
      };
      /* 关闭时 */
      ws.onclose = function () {
        console.log("关闭连接");
      };
      /* 发送消息 */
      document.getElementById("send").onclick = function () {
        var str = document.getElementById("content").value;
        ws.send(str);
      };
      /* 关闭消息 */
      document.getElementById("close").addEventListener("click", function () {
        ws.close();
      });
    </script>
  </body>
</html>

粤ICP备2024285819号