WebSocket 测试

连接/收发/心跳测试

415 次访问
WEBSOCKET TESTER

WebSocket 在线测试

连接 / 收发 / 心跳 · 浏览器本地

日志

关于本工具

了解工具定位 · 使用场景 · 对比优势

使用场景

🔌

WebSocket 联调

前端开发者在对接实时推送接口时,后端文档只说「连接 ws://xxx 后监听 message 事件」。用本工具直接输入后端地址,一键建立连接,手动发送 JSON 格式的订阅消息,实时查看服务端返回的原始数据帧,快速定位字段名拼写错误或数据类型不匹配问题,无需写测试代码。

💓

长连接保活验证

物联网设备通过 WebSocket 上报传感器数据,但设备端每隔 60 秒需发一次 ping 帧维持连接。运维人员用本工具连接设备网关,手动发送心跳包并观察服务端是否回复 pong,验证网关的心跳超时策略是否按预期断开僵尸连接,避免因连接池占满导致新设备无法接入。

🧪

协议兼容性测试

第三方支付回调使用 WebSocket 推送交易结果,但对方服务器只支持 wss 且要求特定 subprotocol。测试人员用本工具填写 wss 地址和 subprotocol 头,连接后发送模拟的支付成功报文,检查服务端是否按约定返回 ack 帧,确认跨域名、跨协议栈的握手流程没有异常。

🛡️

安全策略排查

安全审计时怀疑 WebSocket 连接存在 CSRF 漏洞,攻击者可能利用未校验 Origin 头的漏洞劫持连接。用本工具构造不同 Origin 头的连接请求,观察服务端是否拒绝非法来源,验证 CORS 配置是否生效,确保只有白名单域名能建立 WebSocket 通道。

对比矩阵本工具 vs 竞品 vs 传统方法

维度本工具竞品 A (PieSocket)传统方法 (命令行)
连接配置支持 URL 输入,可选子协议、自定义请求头提供 SDK/API,需集成代码需手写脚本,如 wscat、websocat
心跳测试内置 Ping/Pong 帧发送与响应检测需自行实现心跳逻辑需手写脚本处理帧
收发消息可视化输入框,支持 JSON/文本/十六进制通过 SDK 事件监听需解析命令行输出
数据隐私纯浏览器处理,无服务器中转数据经过 PieSocket 服务器数据直连目标服务器
离线可用页面加载后完全离线可用依赖网络 API 服务依赖本地安装的工具包
使用门槛零安装,浏览器打开即用需注册账号、阅读文档需安装命令行工具并了解协议
并发连接单页面单连接支持多连接管理可脚本化多连接

使用指南

上手步骤 · 输入输出 · 避坑提示

输入输出示例7 个典型场景,覆盖常规、边界与易错

输入输出说明
wss://echo.websocket.org连接成功 | 收到服务端回复: 你发送的消息典型场景:公共回显服务,验证基本连接与收发
ws://localhost:8080/chat连接成功 | 等待服务端消息典型场景:本地开发调试 WebSocket 服务
wss://stream.binance.com:9443/ws/btcusdt@trade连接成功 | 收到实时交易数据(JSON 格式)典型场景:连接公开数据流,验证实时推送
ws://192.168.1.100:9000连接失败: 连接超时 (30s)边界 case:目标 IP 不可达或端口未开放
wss://invalid.example.com/ws连接失败: DNS 解析错误边界 case:域名不存在或 DNS 配置错误
ws://127.0.0.1:65536连接失败: 端口号超出范围 (0-65535)易错 case:端口号超过最大允许值
wss://echo.websocket.org (发送空消息)发送成功 | 收到空字符串回复易错 case:空消息是否被视为合法数据帧

常见错误对照8 个常踩的坑 · 错误 → 修复

1. 未正确关闭连接就重复连接

错误
连续点击连接按钮 3 次,不先断开已有连接
修复
每次连接前先点击断开按钮,或等待连接自动关闭后再新建连接

WebSocket 协议要求同一客户端在同一时间只维持一个连接;重复连接会导致旧连接被服务端丢弃或双方状态不一致。

2. 发送非文本帧(如二进制帧)时未编码

错误
在消息输入框直接粘贴一个 .png 文件的二进制内容(乱码)
修复
将二进制数据用 Base64 编码后发送,并在应用层约定解码方式

WebSocket 支持二进制帧,但浏览器发送框通常只接受文本字符串;直接粘贴二进制会丢失字节完整性或触发编码错误。

3. 心跳间隔设置过短导致服务端误封

错误
心跳间隔设为 500 毫秒(0.5 秒)
修复
心跳间隔设为 30 秒到 60 秒之间

高频心跳包会被服务端视为攻击性行为(DDoS 或探测),许多网关和 WAF 会直接断开连接或封禁 IP。

4. 在 wss 页面测试 ws 地址

错误
在 https://websocket.tl654.com/ 页面输入 ws://echo.websocket.org
修复
在 https 页面使用 wss://echo.websocket.org 或使用 ws:// 地址时需确保页面也是 http

浏览器安全策略禁止 HTTPS 页面发起不安全的 WebSocket 连接(混合内容阻止),控制台会报 Mixed Content 错误。

5. 忘记 WebSocket URL 路径

错误
只输入 ws://example.com 不写路径
修复
ws://example.com/ws 或 ws://example.com/socket.io/?EIO=4&transport=websocket

WebSocket 握手需要完整 URL(包括路径和查询参数);服务端通常根据路径分发到不同 handler,缺路径会 404 或 400。

6. 发送 JSON 时未序列化

错误
直接输入 { "action": "ping", "ts": 1234567890 } 作为纯文本
修复
先确认服务端期望的是 JSON 字符串还是纯文本;若期望 JSON 则直接发送序列化后的字符串

WebSocket 消息本身是二进制或文本帧,不自动解析 JSON;服务端收到的是字符串,需自行 JSON.parse。若服务端期望 JSON 但收到非 JSON 字符串会解析失败。

7. 忽略关闭帧的 code 和 reason

错误
点击断开按钮后不查看关闭帧的状态码和原因
修复
观察关闭事件中的 code(如 1000 正常关闭、1006 异常断开)和 reason 字段

关闭帧的 code 和 reason 是排查连接异常的关键线索;1006 表示连接意外断开(网络/超时),1001 表示服务端主动关闭。

8. 在心跳测试中发送不匹配的 payload

错误
服务端期望 ping/pong 帧,却发送自定义文本 "keepalive"
修复
查阅服务端文档,确认心跳机制是 WebSocket 协议层的 ping/pong 帧还是应用层的自定义消息

WebSocket 协议自带 ping/pong 控制帧(浏览器 API 不暴露),很多服务端用应用层消息做心跳;两者不匹配会导致心跳失效。

工作原理

公式推导 · 流程图解 · 依据出处

核心公式

RTT = T_ack - T_send

变量说明

  • RTT — 往返时延(毫秒)
  • T_send — 数据包发送时刻(毫秒时间戳)
  • T_ack — 对应确认帧接收时刻(毫秒时间戳)

示例

向 wss://echo.websocket.org 发送一条文本消息 'ping',记录发送时刻 T_send = 1712345678000 ms。服务器原样返回 'ping',收到时刻 T_ack = 1712345678120 ms。RTT = 1712345678120 - 1712345678000 = 120 ms。

适用范围

适用于 WebSocket 协议标准(RFC 6455)下的单次消息往返时延测量。不适用于分片消息、多帧合并或存在代理缓冲的场景,此时 RTT 可能包含中间节点处理延迟。

原理图

输入 WebSocket 地址ws:// 或 wss://浏览器发起连接WebSocket API收发消息文本 / JSON心跳检测定时 ping/pong保持连接显示结果连接状态 / 消息日志用户输入本地处理输出结果
用户输入 本地处理 输出结果

开发者集成

3 种主流语言 · 复制即用

import asyncio
import websockets

async def test_websocket():
    uri = "wss://echo.websocket.org"
    async with websockets.connect(uri) as ws:
        # 发送消息
        await ws.send("Hello WebSocket")
        # 接收回显
        response = await ws.recv()
        print(f"Received: {response}")

        # 心跳测试:发送 ping 并等待 pong
        pong = await ws.ping()
        await pong
        print("Pong received, connection alive")

asyncio.run(test_websocket())
package main

import (
	"fmt"
	"net/url"
	"github.com/gorilla/websocket"
	"log"
)

func main() {
	u := url.URL{Scheme: "wss", Host: "echo.websocket.org", Path: ""}
	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer c.Close()

	// 发送消息
	err = c.WriteMessage(websocket.TextMessage, []byte("Hello WebSocket"))
	if err != nil {
		log.Fatal("write:", err)
	}

	// 接收回显
	_, message, err := c.ReadMessage()
	if err != nil {
		log.Fatal("read:", err)
	}
	fmt.Printf("Received: %s\n", message)

	// 心跳测试:发送 Pong 帧(服务端通常回复 Ping)
	err = c.WriteMessage(websocket.PongMessage, []byte("keepalive"))
	if err != nil {
		log.Fatal("pong:", err)
	}
	fmt.Println("Heartbeat sent")
}
const ws = new WebSocket('wss://echo.websocket.org');

ws.onopen = () => {
    console.log('Connected');
    // 发送消息
    ws.send('Hello WebSocket');

    // 心跳:发送 ping(浏览器 WebSocket API 自动处理 pong)
    // 可手动发送空消息作为心跳
    setInterval(() => {
        if (ws.readyState === WebSocket.OPEN) {
            ws.send('ping');
        }
    }, 30000);
};

ws.onmessage = (event) => {
    console.log('Received:', event.data);
};

ws.onerror = (error) => {
    console.error('WebSocket error:', error);
};

常见问题

8 个高频疑问

这个 WebSocket 测试工具怎么用?
打开页面后,在「连接地址」输入框填写 WebSocket 服务器地址(如 ws://example.com/socket 或 wss://example.com/socket),点击「连接」按钮。连接成功后,下方「消息发送」区域会激活,输入文本消息点击「发送」即可查看服务器返回的响应。右侧「消息记录」会显示所有收发数据的时间戳和内容。底部「心跳测试」功能可设置间隔时间(秒),自动发送预设的心跳包并检测连接是否存活。断开连接只需点「断开」按钮。
为什么我连接 ws:// 地址失败了,但同样的地址在别的工具能连上?
最常见原因是浏览器的安全策略限制。在 HTTPS 页面中,浏览器默认禁止从 HTTPS 页面发起不安全的 ws://(非加密)WebSocket 连接。如果当前工具页面是通过 HTTPS 加载的,连接 ws:// 地址会被浏览器拦截。解决方法:1)如果服务器支持,改用 wss:// 加密地址;2)或者通过 HTTP 页面打开本工具(http://websocket.tl654.com/)再尝试连接 ws://。另外,某些防火墙或代理也会阻断 WebSocket 连接,可尝试切换网络环境。
工具能支持发送二进制消息吗?比如图片或文件?
当前版本仅支持文本消息(UTF-8 字符串)的发送和接收,不支持直接发送二进制数据(如 ArrayBuffer 或 Blob)。如果需要测试二进制协议,建议使用专业客户端工具(如 wscat 或 Postman WebSocket 功能)。文本模式覆盖了大部分 WebSocket 调试场景,包括 JSON 协议、心跳包、聊天消息等。发送内容会原样传输,服务器返回的二进制帧会被自动转换为文本显示(可读性取决于编码格式)。
工具会自动发心跳包吗?间隔时间设多少合适?
可以手动开启自动心跳功能。在「心跳测试」区域勾选「启用自动心跳」,设置间隔秒数(建议 10-60 秒),输入心跳消息内容(如 'ping' 或 JSON 格式的保活消息),工具会按间隔定时发送。心跳包内容需要与服务器约定的协议一致。如果服务器不回复或连接断开,状态栏会显示「心跳超时」。间隔太短(<5 秒)可能造成无谓流量消耗,太长(>120 秒)可能被中间设备(如 Nginx、负载均衡器)提前断开连接。建议根据服务器文档或实际测试调整。
为什么我发送消息后服务器没响应?是工具的问题吗?
服务器无响应通常不是工具本身的问题,而是服务器端行为或协议不匹配。首先确认连接状态是「已连接」而不是「已断开」。然后在「消息记录」中查看是否有服务器返回的数据——有些服务器只回复特定格式的消息(如 JSON 中带特定字段),或者需要先完成认证握手。可以尝试发送服务器已知的测试命令(如 'help' 或 'echo')。另外,检查浏览器控制台是否有跨域或安全错误。如果服务器主动关闭连接,工具会显示「连接已关闭」及关闭码。
这个在线工具和用命令行 wscat 测试有什么区别?
本工具是纯浏览器端运行,无需安装任何软件,打开网页即可使用,适合快速调试和简单交互。wscat 是 Node.js 命令行工具,需要先安装 Node 环境再 npm install -g wscat,适合自动化脚本和批量测试。本工具图形化显示收发消息的时间线和内容,适合人肉观察交互过程;wscat 输出纯文本流,适合管道处理。另外,本工具完全在浏览器本地运行,数据不经过服务器;wscat 则直接由本地 Node 进程发起连接。如果只是临时验证 WebSocket 是否通,在线工具更快。
连接 WebSocket 时,工具会记录我的数据吗?会不会泄漏?
不会记录。整个 WebSocket 连接过程和消息收发全部在浏览器本地完成,工具本身不存储、不上传任何数据。连接是浏览器直接与目标服务器建立的,工具页面只是一个控制台界面,不充当中间代理。可以打开浏览器开发者工具的「网络」面板,过滤 WebSocket 连接,可以看到数据是直接发往目标服务器的,没有经过第三方。关闭页面或断开连接后,所有消息记录从内存中清除。如果对隐私有更高要求,可在断网环境下使用(连接本地 WebSocket 服务器)。
为什么连接成功后,过一会儿自动断开了?
自动断开通常由以下几种原因导致:1)服务器设置了空闲超时(如 60 秒无消息自动断开),此时需要开启心跳功能保持连接活跃;2)网络不稳定,WebSocket 依赖 TCP 长连接,短暂的网络波动可能导致断开,工具会显示「连接异常关闭」并给出关闭码(如 1006 表示异常断开);3)服务器主动关闭连接(如认证过期、资源限制),工具会显示服务器发送的关闭帧和关闭原因。可以在断开后立即尝试重连,观察是否再次在相同时间点断开,以判断是超时还是其他原因。
选择 打开 +新窗口 esc关闭