开发者工具 · HTTP / 网络速查

WebSocket 测试

连接/收发/心跳测试

本地处理 · 不上传 免费 · 无需登录 无次数限制 累计 58 次使用
未连接 ↑ 发送 0 ↓ 接收 0
示例(公开 echo)
消息日志message log
发送消息send
第一节

关于本工具

About

调试 WebSocket 时,最怕的不是连不上,是连上了却不确定心跳间隔是否匹配服务器预期。输入 URL 点连接,它实时显示握手状态、收发帧的 payload 与时间戳,并支持自定义心跳消息与间隔,验证保活逻辑是否生效。所有数据只在浏览器内存中流转,不经过任何中转服务器——适合排查本地开发环境或内网服务的连接稳定性。

使用场景

联调时断连排查

前端和后端联调 WebSocket 长连接,客户端连上后 3 秒必断。后端查日志说没主动发关闭帧,前端以为是服务端超时。用本工具直连后端地址,不经过业务代码,发现心跳间隔设为 10 秒,但服务端 Nginx 配置的 proxy_read_timeout 只有 5 秒,超时即掐。改配置后连接稳定,节省了半小时抓包定位时间。

判断心跳格式对错

对接第三方推送服务,文档要求每 30 秒发一个 JSON 包 {"type":"ping"}。开发写完后客户端一直掉线,怀疑是服务端没响应 pong。用本工具手动建立连接,按文档格式逐条发送心跳,发现服务端返回的不是 pong 而是错误码 4001,原因是 JSON 里多了一个逗号。修正格式后连接正常,避免了上线后大规模断连事故。

验证消息推送到达

游戏服务器凌晨 2 点要全服推送维护公告,但运营怀疑推送模块只在白天正常。运维在凌晨 1:55 用本工具连接游戏 WebSocket 网关,手动发送一条测试公告 JSON。工具实时显示服务端返回的 ack 确认帧,确认推送链路在低负载时段仍能正常收发,公告准时发出,没有出现玩家收不到通知的投诉。

区分是代码还是网络问题

客户端连 WebSocket 经常超时,开发怀疑是用户 WiFi 防火墙拦截了 443 端口以外的连接。用本工具在目标服务器上起一个 8080 端口的 WebSocket 服务,从客户端浏览器直接连接。如果连不上,说明网络层确实阻断了非标端口;如果连上,则问题出在业务代码的握手逻辑。最终确认是客户端未正确处理 TLS 证书验证,而非防火墙。

压力测试前验证协议

要对聊天系统做 1000 并发压力测试,但压测脚本需要先确认 WebSocket 子协议协商参数。用本工具手动发送 Upgrade 请求,查看响应头中 Sec-WebSocket-Protocol 字段返回的协议名。发现服务端同时支持 chat-v1 和 chat-v2,但压测脚本只配了 v1,导致部分连接被服务端拒绝。改脚本后压测顺利跑通。

第二节

使用指南

Getting Started

使用步骤

  1. 1在「服务器地址」输入框填写 WebSocket 连接 URL(如 ws://example.com/ws),点击「连接」按钮,状态指示灯由红变绿表示握手成功
  2. 2在「消息内容」文本框输入待发送的文本或 JSON 数据,点击「发送」按钮,消息立即出现在「已发送」日志区并带时间戳
  3. 3观察「已接收」日志区:服务端返回的消息自动显示在此处,每条消息附带时间戳和消息长度(字节数)
  4. 4勾选「自动心跳」开关,工具每隔 30 秒自动发送 ping 帧,心跳日志区显示每次 ping/pong 的往返延迟(毫秒)
  5. 5点击「断开」按钮终止连接,状态指示灯变红,日志区追加一条断开记录及连接总时长

输入输出示例

输入输出说明
wss://echo.websocket.org连接成功 → 发送 'Hello' → 收到 'Hello'(回声)常规:标准回声服务器,验证基本连接与收发功能是否正常。
ws://localhost:8080/chat连接失败:WebSocket connection to 'ws://localhost:8080/chat' failed: 连接被拒绝 (ECONNREFUSED)常规:本地未启动服务时的典型报错,帮助用户区分服务端未运行与协议错误。
wss://echo.websocket.org(发送空消息)发送 '' → 收到 ''(回声)边界:空消息是否被服务端接受并返回,部分服务端会忽略或断开连接。
wss://echo.websocket.org(发送超长消息,如 100KB 文本)发送成功 → 收到相同内容(回声)边界:验证工具与服务端对大数据帧的处理能力,部分代理或实现会截断或超时。
ws://invalid-host:1234连接失败:getaddrinfo ENOTFOUND invalid-host边界:域名不存在时的 DNS 解析失败,与端口不通的错误信息不同,便于用户排查。
wss://echo.websocket.org(连接后等待 60 秒不操作)60 秒后收到服务端 Ping 帧 → 工具自动回复 Pong → 连接保持易错:用户常忽略 WebSocket 心跳机制,此示例暴露工具是否自动处理 Ping/Pong。
wss://echo.websocket.org(发送非法 UTF-8 字节序列,如 0xFF 0xFE)发送失败:数据包含无效 UTF-8 序列,请检查输入编码易错:WebSocket 文本帧要求 UTF-8 编码,二进制数据需使用二进制帧,此示例帮助用户理解类型限制。

常见错误对照

1.WebSocket URL 协议写错(http:// 或 https://)

✗ 错误ws://example.com/socket 写成 http://example.com/socket
✓ 修复ws://example.com/socket 或 wss://example.com/socket

WebSocket 使用 ws://(明文)和 wss://(TLS 加密)协议,http/https 是 HTTP 协议,服务端无法识别,连接会直接失败。

2.忘记带路径或路径拼错

✗ 错误ws://example.com 但服务端实际路径是 /ws/chat
✓ 修复ws://example.com/ws/chat

WebSocket 连接路径由服务端定义(如 /ws、/socket.io),不带路径或拼错会导致 404 或连接被拒绝。

3.发送 JSON 时没序列化,直接传对象

✗ 错误在浏览器控制台写 ws.send({type: 'ping'})
✓ 修复ws.send(JSON.stringify({type: 'ping'}))

WebSocket send() 只接受字符串、Blob、ArrayBuffer 等,JavaScript 对象会被隐式转为 [object Object],服务端收到的是无意义文本。

4.心跳包格式与服务端不匹配

✗ 错误服务端期待字符串 ping,但客户端发的是 JSON {"type":"ping"}
✓ 修复ws.send('ping') 或按服务端文档发送确切格式

心跳机制由服务端定义(如字符串 ping、JSON 或二进制帧),格式不匹配会被服务端视为无效消息,触发超时断开。

5.连接成功后立即发送消息,没等 onopen 触发

✗ 错误new WebSocket(url); ws.send('hello');
✓ 修复ws.onopen = () => { ws.send('hello'); }

WebSocket 连接是异步的,new 之后连接尚未建立,立即 send() 会因连接未就绪而失败(浏览器抛出 InvalidStateError)。

6.关闭连接后继续发送消息

✗ 错误ws.close(); ws.send('data');
✓ 修复ws.close(); // 之后不再调用 send

close() 后连接状态变为 CLOSED 或 CLOSING,此时 send() 会抛出 InvalidStateError。应在 onclose 回调中清理发送逻辑。

7.没处理 onerror 事件,连接失败无反馈

✗ 错误只监听 onmessage,不监听 onerror
✓ 修复ws.onerror = (e) => console.error('连接出错', e);

网络断开、服务端拒绝、TLS 证书错误等都会触发 onerror,不监听则用户完全不知道连接失败,只能干等超时。

8.wss 端口写错或漏写(默认端口 443 但服务端用 8080)

✗ 错误wss://example.com(服务端实际监听 wss://example.com:8080)
✓ 修复wss://example.com:8080

wss:// 默认端口是 443,如果服务端未使用标准端口,必须显式指定,否则连接会超时或被拒绝。

第三节

工作原理

How It Works

核心公式

RTT = (T_recv - T_send) / 2

变量说明

  • RTT往返时延,单位毫秒
  • T_send客户端发送时间戳,毫秒
  • T_recv客户端收到响应时间戳,毫秒

示例

客户端发送心跳帧时记录 T_send = 1712345678000 ms,收到服务器 pong 响应时记录 T_recv = 1712345678120 ms。RTT = (1712345678120 - 1712345678000) / 2 = 120 / 2 = 60 ms。该值表示单程网络延迟,用于评估连接质量。

输入 WebSocket 地址浏览器发起WebSocket 握手发送 / 接收消息内容日志心跳检测(定时 Ping/Pong)连接状态(已连接/断开)
用户输入 本地处理 输出结果
第五节

常见问题

Q & A
连接不上服务器,一直显示连接失败,是工具问题还是我地址写错了?

大概率是地址格式或服务器状态问题。WebSocket 地址必须以 `ws://` 或 `wss://` 开头,后面跟域名或 IP 加端口,比如 `ws://echo.websocket.org`。检查地址是否带 `http://` 前缀——那是 HTTP 协议,不是 WebSocket 协议。另外,目标服务器必须支持 WebSocket 协议,可以用 `wss://` 开头的在线测试服务器先验证工具本身是否正常。如果是本地开发的服务,确认服务已启动且端口未被防火墙拦截。

为什么我发消息过去,收不到任何回复?

有两种常见情况。第一,你连接的服务器是“单向推送”型(比如行情推送),它不会回复你发的任意消息,只会在有数据时主动发给你。第二,你连接的服务器要求先“订阅”某个主题才能收到数据,你需要发一条特定格式的订阅消息(格式要问服务端开发者)。本工具会显示所有从服务器收到的消息,如果一条都没有,说明服务器确实没有向这个 WebSocket 连接推送任何内容,不代表工具没连上。

心跳测试有什么用?怎么设置心跳间隔?

心跳是维持长连接不断开的机制。很多 WebSocket 服务器(尤其是生产环境)会在一段时间内没收到客户端消息时主动断开连接,通常静默断开时间是 30 秒到 5 分钟。心跳测试就是让工具定时发一条空消息(比如 `ping`)给服务器,告诉服务器“我还活着”。本工具的心跳间隔输入框单位是“秒”,一般设为服务器断开时间的 1/3 比较安全。比如服务器 60 秒超时,心跳间隔设 20 秒。

工具是纯浏览器端运行的,那我的 WebSocket 连接数据会上传到你们服务器吗?

不会。本工具是纯前端实现(FE),所有 WebSocket 连接操作都在你的浏览器里直接完成。你输入的服务器地址、发送的消息、收到的数据,都只在你浏览器和那个 WebSocket 服务器之间传输,不经过全宝工具站的任何服务器。关闭页面或断开连接后,本地没有任何日志留存。如果你测试的是敏感数据的 WebSocket 接口,这个特性可以放心。

能不能一次连接多个 WebSocket 服务器,同时对比测试?

目前不直接支持。本工具一次只维护一个 WebSocket 连接。如果需要对比测试,可以打开多个浏览器标签页,每个标签页连接不同的服务器地址。因为工具是纯前端无状态,多开标签页之间不会互相干扰。如果是想测试同一个服务器在不同条件下的响应,也可以先断开当前连接,修改参数后重新连接。

连接 wss:// 的服务器时,浏览器提示证书错误,怎么办?

这是浏览器安全策略导致的。`wss://` 连接需要服务器有有效的 SSL 证书。如果是自签名证书或过期证书,浏览器会阻止连接。解决办法:如果是自己测试用的本地服务器,可以尝试用 `ws://localhost`(不加密)代替 `wss://`。如果是线上服务器证书有问题,需要联系服务器管理员更新证书。本工具无法绕过浏览器的证书校验。

发中文消息会乱码吗?支持什么编码?

WebSocket 协议本身支持 UTF-8 编码的文本消息,所以只要你的输入框和服务器两端都使用 UTF-8 编码,中文不会乱码。本工具发送消息时默认以 UTF-8 文本帧发送。如果服务器使用的是其他编码(比如 GBK),那就可能出现乱码,这种情况需要服务器端做转码处理,或者你先手动转码后再发送。工具目前不支持选择发送帧的编码格式。

隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。

选择 打开 +新窗口 esc关闭