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>
相关推荐
小西↬3 小时前
vite+vue3+websocket处理音频流发送到后端
javascript·websocket·音视频
c_zyer3 小时前
Mermaid流程图可视化系统:基于Spring Boot与Node.js的三层架构实现
spring boot·node.js·流程图·mermaid
开发者小天6 小时前
Node.js中Buffer的用法
node.js·编辑器·vim
阿星做前端7 小时前
如何构建一个自己的 Node.js 模块解析器:node:module 钩子详解
前端·javascript·node.js
寅时码12 小时前
从“一键部署”到“可观测、可定制的发布流”:我如何打造一个企业级部署工具
运维·开源·node.js
这是个栗子12 小时前
【Node.js安装注意事项】-安装路径不能有空格
前端·npm·node.js
chancygcx_13 小时前
前端核心技术Node.js(二)——path模块、HTTP与模块化
前端·http·node.js
丘色果13 小时前
NPM打包时,报reason: getaddrinfo ENOTFOUND registry.nlark.com
前端·npm·node.js
自学也学好编程16 小时前
【BUG】nvm无法安装低版本Node.js:The system cannot find the file specified解决方案
node.js·bug
牧码岛16 小时前
服务端之nestJS常用异常类及封装自定义响应模块
node.js·nestjs