WebSocket调试工具(html),用于调试WebSocket链接是否畅通

WebSocket调试工具,用于调试WebSocket链接是否畅通

纯html+js编写

直接粘贴使用

html 复制代码
<!DOCTYPE html>
<html lang="zh">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>WebSocket 测试工具</title>
    <style>
      body {
        font-family: Arial, sans-serif;
        max-width: 800px;
        margin: 20px auto;
        padding: 20px;
        background-color: #f7f7f7;
      }
      h1 {
        text-align: center;
        color: #333;
      }
      .form-group {
        margin-bottom: 15px;
      }
      label {
        display: block;
        margin-bottom: 5px;
        font-weight: bold;
      }
      input[type="text"] {
        width: 100%;
        padding: 10px;
        border: 1px solid #ccc;
        border-radius: 4px;
        box-sizing: border-box;
      }
      button {
        background-color: #007cba;
        color: white;
        padding: 10px 15px;
        border: none;
        border-radius: 4px;
        cursor: pointer;
        margin-right: 10px;
      }
      button:hover {
        background-color: #005a87;
      }
      button:disabled {
        background-color: #ccc;
        cursor: not-allowed;
      }
      #status {
        margin: 15px 0;
        font-weight: bold;
      }
      #messages {
        height: 300px;
        overflow-y: auto;
        border: 1px solid #ccc;
        padding: 10px;
        background-color: #fff;
        border-radius: 4px;
        font-family: monospace;
      }
      .log {
        margin: 5px 0;
        color: #333;
      }
      .received {
        color: #007cba;
      }
      .sent {
        color: #28a745;
      }
      .system {
        color: #666;
        font-style: italic;
      }
    </style>
  </head>
  <body>
    <h1>WebSocket 测试工具</h1>

    <div class="form-group">
      <label for="wsUrl">WebSocket 地址:</label>
      <input
        type="text"
        id="wsUrl"
        placeholder="例如: ws://10.10.2.10:85214 或 wss://yourdomain.com/ws"
        value="ws://10.10.60.248:31636/agent/simple-push"
      />
    </div>

    <button id="connectBtn">连接</button>
    <button id="disconnectBtn" disabled>断开</button>

    <div class="form-group">
      <label for="messageInput">发送消息:</label>
      <input
        type="text"
        id="messageInput"
        placeholder="输入要发送的消息"
        disabled
      />
    </div>

    <button id="sendBtn" disabled>发送</button>

    <div id="status">状态: 未连接</div>

    <div id="messages"></div>

    <script>
      let ws = null;
      const wsUrlInput = document.getElementById("wsUrl");
      const messageInput = document.getElementById("messageInput");
      const connectBtn = document.getElementById("connectBtn");
      const disconnectBtn = document.getElementById("disconnectBtn");
      const sendBtn = document.getElementById("sendBtn");
      const statusDiv = document.getElementById("status");
      const messagesDiv = document.getElementById("messages");

      function log(message, type = "system") {
        const el = document.createElement("div");
        el.className = `log ${type}`;
        el.textContent = `[${new Date().toLocaleTimeString()}] ${message}`;
        messagesDiv.appendChild(el);
        messagesDiv.scrollTop = messagesDiv.scrollHeight;
      }

      connectBtn.addEventListener("click", () => {
        const url = wsUrlInput.value.trim();
        if (!url) {
          alert("请输入 WebSocket 地址");
          return;
        }

        try {
          ws = new WebSocket(url);

          ws.onopen = () => {
            log("WebSocket 连接已建立", "system");
            statusDiv.textContent = "状态: 已连接";
            statusDiv.style.color = "green";
            messageInput.disabled = false;
            sendBtn.disabled = false;
            connectBtn.disabled = true;
            disconnectBtn.disabled = false;
          };

          ws.onmessage = (event) => {
            log(`收到: ${event.data}`, "received");
          };

          ws.onclose = (event) => {
            log(`连接已关闭: ${event.code} ${event.reason}`, "system");
            statusDiv.textContent = "状态: 已断开";
            statusDiv.style.color = "red";
            messageInput.disabled = true;
            sendBtn.disabled = true;
            connectBtn.disabled = false;
            disconnectBtn.disabled = true;
            ws = null;
          };

          ws.onerror = (error) => {
            log(`连接错误: ${error}`, "system");
            statusDiv.textContent = "状态: 连接失败";
            statusDiv.style.color = "red";
          };
        } catch (err) {
          log(`连接异常: ${err.message}`, "system");
        }
      });

      disconnectBtn.addEventListener("click", () => {
        if (ws) {
          ws.close();
        }
      });

      sendBtn.addEventListener("click", () => {
        const msg = messageInput.value.trim();
        if (!msg || !ws) return;

        try {
          ws.send(msg);
          log(`发送: ${msg}`, "sent");
          messageInput.value = "";
        } catch (err) {
          log(`发送失败: ${err.message}`, "system");
        }
      });

      // 回车发送
      messageInput.addEventListener("keypress", (e) => {
        if (e.key === "Enter") {
          sendBtn.click();
        }
      });
    </script>
  </body>
</html>
相关推荐
周末也要写八哥8 小时前
html网页设计适合新手的学习路线总结
html
ZC跨境爬虫9 小时前
【爬虫实战对比】Requests vs Scrapy 笔趣阁小说爬虫,从单线程到高效并发的全方位升级
前端·爬虫·scrapy·html
爱上好庆祝9 小时前
svg图片
前端·css·学习·html·css3
汤愈韬14 小时前
网络安全之网络基础知识_2
网络协议·安全·web安全
阿捞216 小时前
Inertia.js 持久布局实现原理
前端·javascript·html
风逸尘_lz17 小时前
05-LPB3568针对不同网段实现UDP通信
网络·网络协议·udp
灰子学技术19 小时前
Envoy 中 TCP 网络连接实现分析
运维·服务器·网络·网络协议·tcp/ip
IpdataCloud19 小时前
米哈游黑产案解析:游戏账号批量注册如何用IP查询识别外挂与多开用户?操作指南
网络协议·tcp/ip·游戏
星宇笔记19 小时前
我做了一个本地网页版嵌入式调试工具:支持 Serial / TCP / UDP、实时曲线、HEX 发送
单片机·嵌入式硬件·网络协议·tcp/ip·udp·开源软件
请数据别和我作队19 小时前
Python实现直播弹幕数据采集(WebSocket实时弹幕采集)
开发语言·网络·python·websocket·网络协议·学习分享