命令行玩转WebSocket:别再只用浏览器测试了

更新日期: 2025-12-02 阅读: 13 标签: WebSocket

什么是WebSocat?

WebSocat是一个用Rust编写的命令行WebSocket工具,设计灵感来自netcat、socat和curl,但专门为WebSocket协议打造。


快速安装

包管理器一键安装

macOS(Homebrew):

brew install websocat

FreeBSD:

pkg install websocat

Ubuntu/Debian:

# 需要先添加PPA源
sudo add-apt-repository ppa:gqview/ppa
sudo apt update
sudo apt install websocat

下载预编译版本

直接从GitHub Releases下载对应系统的版本,解压就能用。
项目地址:https://github.com/vi/websocat

从源码编译

# 需要先安装Rust
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

# 安装WebSocat
cargo install websocat

实用场景和命令示例

1. 最简单的回显测试

# 连接到公共的WebSocket回显服务器
websocat ws://echo.websocket.org

输入任意文字,服务器会原样返回。按Ctrl+D退出。

2. 快速搭建本地WebSocket服务

# 启动WebSocket服务器
websocat -s 8080
# 输出:Listening on ws://127.0.0.1:8080/

另一个终端连接:

websocat ws://127.0.0.1:8080/

这就搭建了一个简单的聊天室雏形!

3. TCP转WebSocket双向代理

把SSH流量转换成WebSocket格式:

websocat --oneshot -b ws-l:127.0.0.1:1234 tcp:127.0.0.1:22

适用于穿透防火墙,或者把传统TCP服务集成到网页应用中。

4. 广播消息给所有连接的客户端

websocat -t ws-l:127.0.0.1:1234 broadcast:mirror:

每个连接进来的客户端都能看到其他人发送的消息——轻松实现群聊功能!

5. 安全连接(WSS)

# 连接安全的WebSocket服务
websocat wss://your-secure-ws.com

# 开发时跳过证书验证
websocat -k wss://localhost:8443

更多实用例子

测试远程WebSocket服务

# 连接到生产环境的WebSocket
websocat wss://api.example.com/ws

# 带上认证头信息
websocat --header="Authorization: Bearer your_token" wss://api.example.com/ws

# 设置连接超时
websocat --timeout=10 wss://api.example.com/ws

文件传输

# 发送文件内容到WebSocket
websocat ws://localhost:8080 < input.txt

# 保存接收到的消息到文件
websocat ws://localhost:8080 > output.txt

# 双向文件传输
websocat ws://localhost:8080 < input.txt > output.txt

实时日志监控

# 监控应用日志
tail -f app.log | websocat ws://localhost:8080/logs

# 从多个源收集日志
websocat ws://logserver:8080 | tee -a combined.log

高级技巧:不只是简单连接

1. 流量监控和调试

# 查看详细的协议交互
websocat --log-io log: ws://localhost:8080

# 只查看消息内容(不显示控制帧)
websocat --text-mode ws://localhost:8080

# 十六进制显示数据
websocat --binary-mode ws://localhost:8080 | hexdump -C

2. 性能优化

# 异步I/O提升性能
websocat --async-stdio ws://localhost:8080

# 调整缓冲区大小
websocat -B 65536 ws://localhost:8080

# 提高并发处理能力
websocat --max-connections=100 ws-l:127.0.0.1:8080

3. 自动重连和容错

# 断线自动重连
websocat autoreconnect: ws://unstable-server:8080

# 重连延迟和次数设置
websocat --reconnect-delay=5 --max-reconnects=10 ws://unstable-server:8080

4. JSON-RPC支持

# 与Chrome DevTools协议通信
echo '{"id":1,"method":"Page.navigate","params":{"url":"https://example.com"}}' | \
websocat --jsonrpc ws://127.0.0.1:9222/devtools/page/XXX

# 发送JSON格式的消息
echo '{"type":"message","content":"Hello"}' | websocat ws://localhost:8080

# 接收并解析JSON响应
websocat --json-output ws://localhost:8080

5. 数据压缩传输

# 启用gzip压缩
websocat --compress=gzip ws://localhost:8080

# 启用deflate压缩
websocat --compress=deflate ws://localhost:8080

# 双向压缩
websocat --compress-both ws://localhost:8080

系统集成:不只是临时工具

1. 作为systemd服务运行

创建服务文件/etc/systemd/system/websocat.service:

[Unit]
Description=WebSocat WebSocket Proxy
After=network.target

[Service]
Type=simple
User=websocket
WorkingDirectory=/opt/websocat
ExecStart=/usr/local/bin/websocat ws-l:127.0.0.1:8080 tcp:127.0.0.1:3000
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

启动服务:

sudo systemctl daemon-reload
sudo systemctl enable websocat
sudo systemctl start websocat

2. 配合Nginx反向代理

Nginx配置示例:

# WebSocket代理配置
location /mywebsocket {
    proxy_pass http://localhost:8080;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    
    # 超时设置
    proxy_read_timeout 86400s;
    proxy_send_timeout 86400s;
    proxy_connect_timeout 75s;
    
    # 缓冲区设置
    proxy_buffering off;
    proxy_buffer_size 4k;
    proxy_buffers 8 4k;
}

3. Docker容器化

创建Dockerfile:

FROM rust:alpine as builder
RUN apk add --no-cache musl-dev
RUN cargo install websocat

FROM alpine:latest
COPY --from=builder /usr/local/cargo/bin/websocat /usr/local/bin/websocat
EXPOSE 8080
CMD ["websocat", "ws-l:0.0.0.0:8080", "tcp:backend:3000"]

构建和运行:

docker build -t websocat-proxy .
docker run -p 8080:8080 --name websocat websocat-proxy

实际应用场景

场景1:调试WebSocket应用

# 监控客户端和服务器的消息交换
websocat --log-io log: ws://localhost:8080

# 模拟客户端发送测试消息
echo '{"action":"ping","timestamp":"2024-01-01"}' | websocat ws://localhost:8080

# 记录完整会话
websocat --log-io log: ws://localhost:8080 | tee session.log

场景2:API网关测试

# 测试WebSocket API
websocat --header="X-API-Key: test123" wss://api.example.com/v1/ws

# 发送结构化测试数据
cat test_data.json | websocat wss://api.example.com/v1/ws

# 批量测试
for i in {1..10}; do
  echo "Test message $i" | websocat ws://localhost:8080
done

场景3:实时数据管道

# 从WebSocket读取数据,处理后写入数据库
websocat ws://>| \
  jq '. | select(.value > 100)' | \
  mysql -u user -p database -e "INSERT INTO readings VALUES (...)"

# 监控和报警
websocat ws://monitor:8080 | \
  while read line; do
    if echo "$line" | grep -q "ERROR"; then
      echo "警报:发现错误" | mail -s "系统警报" admin@example.com
    fi
  done

场景4:跨网络传输

# 通过WebSocket隧道访问内网服务
# 服务器端(内网)
websocat --oneshot -b ws-l:0.0.0.0:8080 tcp:127.0.0.1:22

# 客户端(外网)
websocat --oneshot tcp:127.0.0.1:2222 ws://server.com:8080

# 然后通过SSH连接
ssh -p 2222 user@localhost

常用命令速查

连接相关

# 基本连接
websocat ws://host:port/path

# 带认证头
websocat --header="Authorization: Bearer token" ws://host:port

# 多个头信息
websocat --header="X-User-ID: 123" --header="X-Client: test" ws://host:port

服务器模式

# 启动服务器
websocat -s port

# 指定监听地址
websocat ws-l:0.0.0.0:port

# 服务器广播模式
websocat broadcast: ws-l:127.0.0.1:port

调试和监控

# 显示详细日志
websocat --verbose ws://host:port

# 只显示消息(跳过控制帧)
websocat --text-mode ws://host:port

# 显示时间戳
websocat --timestamp ws://host:port | tee -a log.txt

故障排除

常见问题解决

  1. 连接被拒绝

    # 检查端口是否开放
    nc -zv host port
    
    # 检查防火墙设置
    sudo ufw status
  2. SSL证书问题

    # 跳过证书验证(仅开发环境)
    websocat -k wss://host:port
    
    # 使用自定义CA证书
    websocat --ca-file=/path/to/ca.pem wss://host:port
  3. 性能问题

    # 调整缓冲区大小
    websocat -B 131072 ws://host:port
    
    # 启用异步模式
    websocat --async-stdio ws://host:port

最后总结

在微服务、实时通信、物联网设备调试越来越普遍的今天,掌握一个高效的WebSocket命令行工具,能极大提升开发效率。WebSocat就是那个被很多人忽视的"终端利器"。

无论你是需要:

  • 快速测试WebSocket服务

  • 调试实时通信应用

  • 搭建简单的WebSocket服务器

  • 实现网络隧道

  • 监控数据流

WebSocat都能帮到你。它轻量、快速、功能强大,是你工具箱里值得拥有的好工具。

本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://fly63.com/article/detial/13259

利用websocket监控服务器

websocket是实现浏览器和web服务器沟通的一个好方法。一个比较好的使用方法就是在web网页上使用websocket,然后再起一个webdocketd服务器。

基于WebSocket实现网页聊天室

HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽并达到实时通讯。在 WebSocket API,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道。两者之间就直接可以数据互相传送。

WebSocket简介_WebSocket 快速入门

WebSocket是基于TCP的一种新的网络协议,并在2011年被IETF定为标准的全双工通信协议,它实现了客户端与服务器全双工通信。 WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。

WebSocket 与 Polling , Long-Polling , Streaming 的比较!

Web Sockets定义了一种在通过一个单一的 socket 在网络上进行全双工通讯的通道。它不仅仅是传统的 HTTP 通讯的一个增量的提高,尤其对于实时、事件驱动的应用来说是一个飞跃。

搞懂WebSocket原理

WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)

理解WebSocket心跳及重连机制

在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件。这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失

websocket通信failed to execute send问题的解决

在建立web socket通信后,发送数据时,出现下图所示现象:要明白这个问题产生的原因,就需要了解websocket的几个状态。通常在实例化一个websocket对象之后,客户端就会与服务器进行连接

WebSocket 和 HTTP 的区别

在 websocket 出现之前,为了实现 web 端的实时通信,通常采用的是 Ajax 轮询技术,(轮询是在特定的时间间隔内,由浏览器向服务器发送 HTTP 请求,再由服务器返回最新的数据)

websocket无法注入问题解决方案

websocket服务端往往需要和服务层打交道,因此需要将服务层的一些bean注入到websocket实现类中使用,但是呢,websocket实现类虽然顶部加上了@Component注解,依然无法通过@Resource和@Autowire注入spring容器管理下的bean

websocket对象及方法

以下 API 用于创建 WebSocket 对象。以上代码中的第一个参数 url, 指定连接的 URL。第二个参数 protocol 是可选的,指定了可接受的子协议。以下是 WebSocket 对象的属性。

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!