Node.js+html5实现WebSocket服务示例

javascript 复制代码
{
  "scripts": {
    "dev": "node ws.js",
    "ncc": "ncc build ./ws.js -m -o ./dist/"
  },
  "dependencies": {
    "@vercel/ncc": "^0.36.1",
    "ws": "^8.13.0"
  }
}
javascript 复制代码
const http = require("http");
const fs = require("fs");
const { WebSocket, WebSocketServer } = require("ws");

var fun = function (request, response) {
  var stream = fs.createReadStream("./ws.html", {
    flag: "r",
    encoding: "utf8",
  });
  stream.pipe(response);
};

var server = http.createServer(fun).listen(9091);
var wsServer = new WebSocketServer({ server: server });

wsServer.broadcast = (msg) => {
  wsServer.clients.forEach((client) => {
    if (client.readyState == WebSocket.OPEN) {
      client.send("【广播】" + msg);
      console.log(666.789, wsServer.clients);
    }
  });
};

wsServer.on("connection", (ws, req) => {
  console.log(666.1001, ws, req);

  ws.on("message", (msg) => {
    const msgObj = JSON.parse(msg.toString());
    if (msgObj?.type) {
      if (msgObj.type === "login") {
        ws.userinfo = msgObj.userinfo;
      }
      if (msgObj?.data) {
        const msgStr = ws.userinfo.username + "说:" + msgObj.data.msg;
        console.log(666.10021, msgObj);
        ws.send("服务器[私发]:" + msgStr);
        wsServer.broadcast(msgStr);
      }
    }
  });

  ws.on("close", () => {
    console.log(666.1005, "ws is closed!");
  });
});
html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Node.js+html5实现WebSocket服务示例</title>
  </head>
  <body>
    <div id="show"></div>
    <div>
      <input id="message" type="text" style="width: 200px" />
      <button type="button" id="send" onclick="sendMessage();">Send!</button>
      <button type="button" id="send" onclick="exit();">exit</button>
    </div>
    <script>
      var ws = new WebSocket("ws://localhost:9091");

      ws.onopen = (e) => {
        console.log("Connection to server opened" + ws.readyState);

        document.getElementById("show").innerHTML =
          "连接状态:" + ws.readyState + "</br>";

        ws.send(
          JSON.stringify({
            type: "login",
            userinfo: { username: 'asai' + Date.now(), password: "123456" },
          })
        );

        ws.onmessage = (evt) => {
          console.log(666.10002, evt);
          document.getElementById("show").innerHTML += evt.data + "</br>";
        };

        ws.onclose = (evt) => {
          console.log("WebSocketClosed!");
          console.log(evt);
        };
      };

      function sendMessage() {
        var msg = document.getElementById("message").value;
        var msgObj = { type: "message", data: { msg: msg } };
        ws.send(JSON.stringify(msgObj));
        document.getElementById("message").value = "";
      }

      function exit() {
        ws.close();
        console.log("退出啦");
      }
    </script>
  </body>
</html>
相关推荐
濮水大叔7 小时前
Cabloy/Vona 为什么不需要 NestJS 的 Dynamic Module
typescript·node.js·nestjs
匠云创新9 小时前
读完一万段要两分钟:我们把标书读取从 WPS 对象模型搬到了 docx 解析
性能优化·node.js
某哈压力大17 小时前
SSH 突然 Connection reset?不是密钥坏了,是 OpenSSL 把 sshd 干趴了
前端·node.js·命令行
回眸&啤酒鸭18 小时前
【回眸】Node.js 新手从零到一实战指南
node.js
浪遏1 天前
recruitment-cli:让 AI 接手求职招聘,从架构到一次发送超时
架构·typescript·node.js
刘马想放假2 天前
CANviz 使用指南|Linux 安装、DBC 解码、实时曲线与 J1939 实战
linux·python·websocket
沉默小管2 天前
我用 NestJS + Nuxt 3 做了个导航站,聊几个踩过的坑
node.js·seo
张小姐的猫3 天前
【基于 WebSocket 的多用户网页五子棋】—— 项目结构设计与实用工具类模块
网络·websocket·网络协议
非优秀程序员3 天前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
Hone3 天前
juejin-skills 系列 ②:我把「看掘金热榜」也做成了 Agent 技能
开源·node.js·ai编程