用JavaScript、Nodejs写一个本地tcp服务,用于前端WebSocket调试

效果:

准备工作:

新建一个文件夹,在根目录安装依赖:

复制代码
npm install ws express

依赖介绍:

WS是一个轻量级、高效的WebSocket库,适用于Node.js环境。

express 是一个流行的Node.js Web应用程序框架。

新建server.js文件,和public文件夹,public下新建index.html:

server.js:

介绍:PORT为运行端口,看板地址为http://localhost: + PORT,连接地址为ws://localhost:+ PORT

javascript 复制代码
const express = require('express');
const WebSocket = require('ws');
const app = express();
const PORT = 3000;

// 创建 HTTP 服务
app.use(express.static(__dirname + '/public'));
const server = app.listen(PORT, () => {
  
});

// 创建 WebSocket 服务
const wss = new WebSocket.Server({ server });
let clients = [];

wss.on('connection', (ws) => {
  clients.push(ws);
  console.log(`New client connected. Total clients: ${clients.length}`);

  // 监听客户端消息
  ws.on('message', (message) => {
    console.log(`Received message: ${message}`);
    try {
      const parsedMessage = JSON.parse(message);
      if (parsedMessage.command === "ping") {
        ws.send(JSON.stringify({ command: "pong", data: "pong response" }));
      }
    } catch (e) {
      // 若消息不是 JSON 格式的字符串,直接处理为普通消息
      ws.send(`Echo: ${message}`);
    }
  });

  // 当客户端断开连接时,从列表中移除并记录信息
  ws.on('close', () => {
    clients = clients.filter((client) => client !== ws);
    console.log(`Client disconnected. Total clients: ${clients.length}`);
  });
});

// 定义推送消息的函数,广播给所有客户端
function broadcastMessage(message) {
  clients.forEach((client) => {
    if (client.readyState === WebSocket.OPEN) {
      client.send(message);
    }
  });
}

// 定义 API 接口用于前端推送消息
app.use(express.json());
app.post('/send', (req, res) => {
  const message = req.body.message;
  // 广播消息给所有客户端
  broadcastMessage(message);
  res.json({ status: 'Message sent' });
});

index.html:

介绍:可以根据自己测试的需要改变sendMessage发送的格式

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>WebSocket Client</title>
  <style>
    #messages {
      border: 1px solid #ccc;
      padding: 10px;
      height: 200px;
      overflow-y: auto;
      margin-bottom: 10px;
    }
    .message {
      margin: 5px 0;
      padding: 5px;
    }
    .sent {
      color: green;
    }
    .received {
      color: black;
    }
    .status {
      color: blue;
    }
    .item{
        font-size: 12px;
        margin: 10px 0 ;
        display: flex;
        align-items: center;
    }
  </style>
</head>
<body>

  <div class="item">
    指令:
    <input type="text" id="command" placeholder="输入command" />
  </div>
  <div  class="item">
    数据:
    <input type="text" id="data" placeholder="输入data" />
  </div>
  <button onclick="sendMessage()">发送</button>
  <div id="messages"></div>
  <script>
    // WebSocket 连接
    const ws = new WebSocket("ws://localhost:3000");

    // 监听连接成功
    ws.onopen = () => {
      displayMessage("Connected to WebSocket server", 'status');
    };

    // 监听消息
    ws.onmessage = (event) => {
      const receivedData = event.data;
      displayMessage(receivedData, 'received');
    };

    // 发送消息
    function sendMessage() {
      const command = document.getElementById("command").value;
      const data = document.getElementById("data").value;
      if (command) {
        ws.send(JSON.stringify({
            command
        }));  // 发送消息到 WebSocket 服务器
        displayMessage(command, 'sent');  // 显示发送的消息
        // 通过 HTTP POST 向后端发送消息
        fetch('http://localhost:3000/send', {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({ message: JSON.stringify({
            command,
            data:data ?? {}
        }) })
        }).then(response => response.json())
          .then(data => console.log(data));
      }
      document.getElementById("message").value = "";  // 清空输入框
    }

    // 显示消息
    function displayMessage(message, type) {
      const messagesDiv = document.getElementById("messages");
      const newMessage = document.createElement("div");
      newMessage.className = `message ${type}`;
      newMessage.textContent = `${type === 'sent' ? '发送' : type === 'received' ? '接收' : '状态'}: ${message}`;
      messagesDiv.appendChild(newMessage);
      messagesDiv.scrollTop = messagesDiv.scrollHeight;
    }
  </script>
</body>
</html>

使用:

根目录执行命令:node server

表单用浏览器访问:http://localhost:3000/

接收端WebSocket连接地址ws://localhost:3000也可以改成IP

接收端WebSocket我写过Android和uniapp的,可以参考下列文章:

https://blog.csdn.net/m0_49083276/category_12433687.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12433687&sharerefer=PC&sharesource=m0_49083276&sharefrom=from_linkhttps://blog.csdn.net/m0_49083276/category_12433687.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12433687&sharerefer=PC&sharesource=m0_49083276&sharefrom=from_link

相关推荐
腾讯TNTWeb前端团队3 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
范文杰7 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪7 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪7 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy8 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom8 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom8 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom8 小时前
React与Next.js:基础知识及应用场景
前端·面试·github
uhakadotcom8 小时前
Remix 框架:性能与易用性的完美结合
前端·javascript·面试
uhakadotcom9 小时前
Node.js 包管理器:npm vs pnpm
前端·javascript·面试