websocat
WebSocket版的Netcat、curl和socat。
示例
连接到公共回声服务器(按Ctrl+D退出)
$ websocat ws://ws.vi-server.org/mirror
123
123
ABC
ABC
$ docker run --rm -ti ghcr.io/vi/websocat:nightly wss://ws.vi-server.org/mirror
123
123
ABC
ABC
服务端和客户端
A$ websocat -s 1234
正在监听 ws://127.0.0.1:1234/
ABC
123
B$ websocat ws://127.0.0.1:1234/
ABC
123
使用远程调试打开Chromium标签页
$ chromium --remote-debugging-port=9222&
$ curl -sg http://127.0.0.1:9222/json/new | grep webSocketDebuggerUrl | cut -d'"' -f4 | head -1
ws://127.0.0.1:9222/devtools/page/A331E56CCB8615EB4FCB720425A82259
$ echo 'Page.navigate {"url":"https://example.com"}' | websocat -n1 --jsonrpc --jsonrpc-omit-jsonrpc ws://127.0.0.1:9222/devtools/page/A331E56CCB8615EB4FCB720425A82259
{"id":2,"result":{"frameId":"A331E56CCB8615EB4FCB720425A82259","loaderId":"EF5AAD19F2F8BB27FAF55F94FFB27DF9"}}
将TCP连接代理到WebSocket连接,反之亦然
$ websocat --oneshot -b ws-l:127.0.0.1:1234 tcp:127.0.0.1:22&
$ websocat --oneshot -b tcp-l:127.0.0.1:1236 ws://127.0.0.1:1234/&
$ nc 127.0.0.1 1236
SSH-2.0-OpenSSH_7.4p1 Debian-10+deb9u3
qwertyu
协议不匹配。
在已连接的WebSocket客户端之间广播所有消息
A$ websocat -t ws-l:127.0.0.1:1234 broadcast:mirror:
B$ websocat ws://127.0.0.1:1234
C$ websocat ws://127.0.0.1:1234
(如果你喜欢这个,你可能会想使用 https://github.com/vi/wsbroad/ )
更多示例请参见 moreexamples.md。
功能
- 从命令行连接和提供WebSocket服务。
- 执行外部程序,使其通过stdin/stdout与WebSocket通信。
- 文本和二进制模式,在行(或空终止记录)和消息之间转换。
- Inetd模式,UNIX套接字(在Linux上包括抽象命名空间)。
- 使用TCP或UNIX套接字与Nginx集成。
- 直接使用未经身份验证的SOCKS5服务器连接WebSocket和监听WebSocket连接。
- 自动重连和连接重用模式。
- 支持Linux、Windows和Mac,提供预构建可执行文件。
- 具有可覆盖底层传输连接的低级WebSocket客户端和服务器,例如调用外部程序作为websocat的传输(用于SSL、代理等)。
安装
安装WebSocat有多种方法。从简单到复杂:
Fedora
Copr: sudo dnf copr enable atim/websocat -y && sudo dnf install websocat
FreeBSD
pkg install websocat
Debian / Ubuntu
- 从GitHub releases下载预构建的可执行文件。
- Websocat尚未正式打包到Debian。一些较旧版本的Websocat可能在GitHub releases上提供Debian软件包文件。
macOS
Homebrew: brew install websocat
MacPorts: sudo port install websocat
从源代码安装
- 安装Rust工具链,然后执行
cargo install --features=ssl websocat
。如果某个-sys
包失败,尝试不带--features=ssl
; - 从源代码构建Websocat(见下文),然后将
target/release/websocat
移动到PATH中的某个位置。
预构建二进制文件
releases页面提供了适用于Linux(普通和musl)、Windows、OS X和Android的预构建二进制文件。
从源代码构建
- 安装Rust工具链。注意,由于其旧依赖项可能被例如这个破坏,Websocat v1(即当前稳定版本)可能无法支持太新的Rust。
cargo build --release --features=ssl
。- 在
target/
下找到可执行文件,例如在target/release/websocat
中。
Rust版本
Websocat版本 | 最低Rust版本 | 最高Rust版本 |
---|---|---|
1.9 - 1.11 | 1.46 | 可能1.63 |
1.6 - 1.8 | 1.34 | 可能1.63 |
1.3 - 1.5 | 1.31 | 1.47? |
1.2 | 1.28 | 1.47? |
1.0-1.1 | 1.23 | 1.47? |
1.2 | ? | ? |
注意,使用旧版Rust(如1.46)构建可能需要在构建前手动将Cargo.lock.legacy
复制到Cargo.lock
。
更早的非异步版本的Websocat应该可以用更旧的rustc构建。
注意,由于https://github.com/rust-lang/rust/pull/71274/,如果使用Rust 1.48或更高版本构建旧版本的Websocat,可能会出现异常行为。
由于[IP地址表示重构],不建议使用Rust 1.64构建v1.x系列的Websocat。这可能会暴露出旧依赖项中先前隐藏的未定义行为。(实际上,它似乎可以正常工作 - 但自我上次详细检查Websocat以来已经过去了很长时间)。
Android上的SSL
websocat的wss://
在Android上可能会失败。作为解决方法,下载证书包,例如从https://curl.haxx.se/ca/cacert.pem,并明确指定:
SSL_CERT_FILE=cacert.pem /data/local/tmp/websocat wss://echo.websocket.org
或者直接使用--insecure
选项。
文档
基本用法示例在本README顶部和--help
消息中提供。更多技巧在moreexamples.md中描述。
这里有一个所有地址类型和覆盖层的列表。
`websocat --help=long`输出
websocat 1.13.0
Vitaly "_Vi" Shukela <vi0oss@gmail.com>
WebSocket的命令行客户端,类似于ws://的netcat/curl/socat。
用法:
websocat ws://URL | wss://URL (简单客户端)
websocat -s port (简单服务器)
websocat [FLAGS] [OPTIONS] <addr1> <addr2> (高级模式)
标志:
--stdout-announce-listening-ports [A] 为每个正在监听的端口向标准输出打印一行
--async-stdio
[A] 在UNIX系统上,将标准输入和标准输出设置为非阻塞模式,而不是生成线程。这应该可以提高性能,但可能会影响在同一控制台上运行的其他程序。
--compress-deflate
[A] 使用deflate方法压缩传入WebSocket的数据。仅影响二进制WebSocket消息。
--compress-gzip
[A] 使用gzip方法压缩传入WebSocket的数据。仅影响二进制WebSocket消息。
--compress-zlib
[A] 使用zlib方法压缩传入WebSocket的数据。仅影响二进制WebSocket消息。
--crypto-reverse
[A] 在`crypto:`指示符中交换加密和解密操作 - 读取时加密,写入时解密。
--dump-spec [A] 不运行,而是将指示符表示输出到标准输出
-e, --set-environment
执行exec:/cmd:/sh-c:时设置WEBSOCAT_*环境变量
目前包括WEBSOCAT_URI和WEBSOCAT_CLIENT,分别表示
请求URI和客户端地址(如果是TCP)
注意防范ShellShock或类似的安全问题。
-E, --exit-on-eof 如果一个数据传输方向达到EOF,则关闭另一个方向
--foreachmsg-wait-read [A] 在关闭foreachmsg:的对等方之前等待读取完成
--jsonrpc
将您输入的消息格式化为JSON RPC 2.0方法调用。第一个词成为方法名,其余部分成为参数,可能会自动包装在[]中。
--jsonrpc-omit-jsonrpc [A] 使用`--jsonrpc`时省略`jsonrpc`字段,例如用于Chromium
--just-generate-key [A] 仅生成Sec-WebSocket-Key值,不运行主要的Websocat
--lengthprefixed-little-endian
[A] 对`lengthprefixed:`覆盖层使用小端帧头而不是大端。
--lengthprefixed-skip-read-direction
[A] 仅影响`lengthprefixed:`覆盖层的一个方向,绕过另一个方向的转换。
--lengthprefixed-skip-write-direction
[A] 仅影响`lengthprefixed:`覆盖层的一个方向,绕过另一个方向的转换。
--linemode-strip-newlines
[A] 不在WebSocket消息中包含来自流的尾随\n或\r\n
-0, --null-terminated 对行模式使用\0而不是\n
--no-line [A] 不自动插入行到消息的转换
--no-exit-on-zeromsg
[A] 遇到零消息时不退出。零消息在Websocat内部使用,因此可能无法完全关闭连接。
--no-fixups
[A] 不执行自动命令行修复。可能会导致websocat操作不稳定。使用--dump-spec而不使用--no-fixups来发现自动插入的内容,并阅读完整的手册了解Websocat内部工作原理。
--no-async-stdio [A] 如果不是tty,则禁止以非阻塞方式使用stdin/stdout
-1, --one-message 仅发送和/或接收一条消息。与--no-close和/或-u/-U一起使用。
--oneshot 仅服务一次。不要与-1(--one-message)混淆
--print-ping-rtts
在每次接收到WebSocket pong后,将测量的往返时间打印到stderr。
--exec-exit-on-disconnect
[A] 使exec:或sh-c:或cmd:在连接关闭时立即退出,不等待终止。
--exec-sighup-on-stdin-close
[A] 使exec:或sh-c:或cmd:在UNIX上在输入关闭时发送SIGHUP。
--exec-sighup-on-zero-msg
[A] 使exec:或sh-c:或cmd:在UNIX上面对传入的零长度消息时发送SIGHUP。
-q 抑制所有诊断消息,除了启动错误
--reuser-send-zero-msg-on-disconnect
[A] 使reuse-raw:在某些客户端断开连接时向对等方发送零长度消息。
-s, --server-mode 简单服务器模式:将TCP端口或addr:port指定为单一参数
-S, --strict
严格的行/消息模式:丢弃过长的消息而不是拆分它们,丢弃不完整的行。
--timestamp-monotonic [A] 对`timestamp:`覆盖层使用单调时钟
-k, --insecure 连接到TLS时接受无效的证书和主机名
--udp-broadcast [A] 设置SO_BROADCAST
--udp-multicast-loop [A] 设置IP[V6]_MULTICAST_LOOP
--udp-oneshot [A] udp-listen: 每个客户端只回复一个数据包
--udp-reuseaddr
[A] 为UDP套接字设置SO_REUSEADDR。监听的TCP套接字总是reuseaddr。
--uncompress-deflate
[A] 使用deflate方法解压来自WebSocket的数据。仅影响二进制WebSocket消息。
--uncompress-gzip
[A] 使用deflate方法解压来自WebSocket的数据。仅影响二进制WebSocket消息。
--uncompress-zlib
[A] 使用deflate方法解压来自WebSocket的数据。仅影响二进制WebSocket消息。
-u, --unidirectional 抑制一个方向的数据复制
-U, --unidirectional-reverse
抑制另一个方向的数据复制(如果与-u结合使用,可能会抑制两个方向)
--accept-from-fd
[A] 在UNIX套接字监听器对等方中不调用`socket(2)`,而是使用指定的文件描述符号作为参数而不是文件名,从`accept(2)`开始
--unlink [A] 在绑定到监听的UNIX套接字之前取消链接
-V, --version 打印版本信息
-v 将详细级别提高到info或更高
-b, --binary 将消息作为二进制消息发送到WebSocket
-n, --no-close 在EOF时不向websocket发送Close消息
--websocket-ignore-zeromsg
[A] 静默丢弃传入的零长度WebSocket消息。由于在Websocat内部使用零长度消息作为EOF标志,它们可能会导致连接关闭。
-t, --text 将消息作为文本消息发送到WebSocket
--base64
将传入的二进制WebSocket消息编码为单行Base64。如果设置了`--binary-prefix`(参见`--help=full`),则在发送之前将以该前缀开头的传出WebSocket消息从base64解码。
--base64-text
[A] 将传入的文本WebSocket消息编码为单行Base64。我不知道这是否有用,但它是为了与`--base64`对称。
选项:
--socks5 <auto_socks5>
使用指定的address:port作为SOCKS5代理。请注意,目前不支持代理认证。
示例:--socks5 127.0.0.1:9050
--autoreconnect-delay-millis <autoreconnect_delay_millis>
[A] `autoreconnect:`覆盖层的重连尝试延迟。[默认:20]
--basic-auth <basic_auth>
添加`Authorization: Basic` HTTP请求头,其中包含此base64编码的参数
--queue-len <broadcast_queue_len>
[A] 广播重用器的待处理队列消息数量 [默认:16]
-B, --buffer-size <buffer_size> 最大消息大小,以字节为单位 [默认:65536]
--byte-to-exit-on <byte_to_exit_on>
[A] 覆盖byte_to_exit_on:覆盖层寻找的字节 [默认:28]
--client-pkcs12-der <client_pkcs12_der> [A] 客户端身份TLS证书
--client-pkcs12-passwd <client_pkcs12_passwd>
[A] --client-pkcs12-der pkcs12存档的密码。在Mac上必需。
--close-reason <close_reason>
以原因消息关闭连接。此选项仅在提供--close-status-code选项时生效。
--close-status-code <close_status_code> 以状态码关闭连接。
--crypto-key <crypto_key>
[A] 为`crypto:`指示符指定加密/解密密钥。需要`base64:`、`file:`或`pwd:`前缀。
-H, --header <自定义头部>...
向WebSocket客户端请求添加自定义HTTP头部。使用冒号和可选的单个空格分隔头部名称和值。可多次使用。注意单个-H可能会吞掉多个后续参数,导致令人困惑的错误。请在最后指定头部或使用等号,如-H='X: y'。
--server-header <自定义响应头部>...
向WebSocket升级响应添加自定义HTTP头部。使用冒号和可选的单个空格分隔头部名称和值。可多次使用。注意单个-H可能会吞掉多个后续参数,导致令人困惑的错误。
--exec-args <执行参数>...
[A] 用于`exec:`说明符的参数。必须是最后一个选项,之后的所有内容都会进入exec参数列表。
--header-to-env <转发到环境变量的头部>...
将指定的传入请求头部转发到H_*环境变量,用于`exec:`类说明符。
-h, --help <帮助>
查看帮助。
--help=short 列出简单选项和地址类型
--help=long 列出所有选项和类型(请参阅[A]标记)
--help=doc 还显示更长的描述和示例。
--inhibit-pongs <抑制pong回复>
[A] 在指定数量的回复后停止回复传入的WebSocket ping。
--just-generate-accept <仅生成接受值>
[A] 仅根据提供的Sec-WebSocket-Key值生成Sec-WebSocket-Accept值,而不运行主要的Websocat。
--lengthprefixed-nbytes <长度前缀字节数>
[A] 为`lengthprefixed:`覆盖层使用此数量的长度头部字节。[默认值:4]
--max-messages <最大消息数>
单个方向复制的最大消息数。
--max-messages-rev <反向最大消息数>
另一个方向复制的最大消息数。
--conncap <最大并行连接数>
监听模式下的最大同时连接数。
--max-sent-pings <最大发送ping数>
[A] 发送此数量的ping后停止发送。
--max-ws-frame-length <最大WS帧长度>
[A] 传入WebSocket帧的最大大小,以防止内存溢出 [默认值:104857600]
--max-ws-message-length <最大WS消息长度>
[A] 传入WebSocket消息的最大大小(不包括一个数据帧),以防止内存溢出 [默认值:209715200]
--origin <源> 向WebSocket客户端请求添加Origin HTTP头部
--pkcs12-der <pkcs12_der>
接受SSL连接所需的pkcs12存档,包含证书和密钥。
生成它的命令:openssl pkcs12 -export -out output.pkcs12 -inkey key.pem -in cert.pem
与-s(--server-mode)选项一起使用或手动指定TLS覆盖层。
更多信息请参阅moreexamples.md。
--pkcs12-passwd <pkcs12密码>
--pkcs12-der pkcs12存档的密码。在Mac上是必需的。
-p, --preamble <前导>...
用指定的字符串作为复制数据的前缀。可多次指定。
-P, --preamble-reverse <反向前导>...
用指定的字符串作为复制数据的前缀(反向)。可多次指定。
--prometheus <prometheus>
除了运行常规Websocat会话外,还在指定的IP地址和端口上公开Prometheus指标。
--request-header <请求头部>...
[A] 为`http-request:`说明符指定HTTP请求头部。
-X, --request-method <请求方法> [A] 用于`http-request:`说明符的方法
--request-uri <请求URI> [A] 用于`http-request:`说明符的URI
--restrict-uri <限制URI>
提供WebSocket服务时,仅接受给定的URI,如`/ws`
这样可以释放其他URI用于提供静态文件或代理等功能。
-F, --static-file <服务静态文件>...
为非WebSocket连接提供命名的静态文件。
参数语法:<URI>:<Content-Type>:<文件路径>
参数示例:/index.html:text/html:index.html
出于安全原因,不支持也不会支持目录。
可多次指定。建议在最后指定或使用等号,如`-F=...`,
否则此选项可能会吞掉位置参数。
--socks5-bind-script <socks5绑定脚本>
[A] 在`socks5-bind:`模式下,当远程端口号已知时执行指定的脚本。
--socks5-destination <socks目标>
[A] 示例:1.2.3.4:5678 2600:::80 hostname:5678
--tls-domain <tls域名>
[A] 使用tls-connect:覆盖层时指定SNI或证书验证的域名
--udp-multicast <udp加入多播地址>...
[A] 为指定的多播地址发出IP[V6]_ADD_MEMBERSHIP。可多次指定。
--udp-multicast-iface-v4 <udp加入多播接口v4>...
[A] 多播网络接口的IPv4地址。必须不指定或指定与多播IPv4地址相同的次数。顺序很重要。
--udp-multicast-iface-v6 <udp加入多播接口v6>...
[A] IPv6多播的网络接口索引。必须不指定或指定与多播IPv6地址相同的次数。顺序很重要。
--udp-ttl <udp_ttl> [A] 设置IP_TTL,如果适用还设置IP_MULTICAST_TTL
--protocol <websocket协议>
连接时指定此Sec-WebSocket-Protocol:头部
--server-protocol <websocket回复协议>
接受连接时强制使用此Sec-WebSocket-Protocol:头部
--websocket-version <websocket版本> 覆盖Sec-WebSocket-Version值
--binary-prefix <ws二进制前缀>
[A] 在每个接收到的WebSocket二进制消息前添加指定文本。同时从发出的消息中去除此前缀,即使指定了`--text`也将它们显式标记为二进制
--ws-c-uri <ws_c_uri>
[A] 用于ws-c:覆盖层的URI [默认值:ws://0.0.0.0/]
--ping-interval <ws_ping间隔> 每隔这么多秒发送WebSocket ping
--ping-timeout <ws_ping超时>
如果在这么多秒内未收到Pong消息,则断开WebSocket连接
--text-prefix <ws文本前缀>
[A] 在每个接收到的WebSocket文本消息前添加指定文本。同时从发出的消息中去除此前缀,即使指定了`--binary`也将它们显式标记为文本
参数:
<addr1> 在简单模式下,要连接的WebSocket URL。在高级模式下,第一个要使用的地址(有多种类型的地址)。有关地址类型的信息,请参阅--help=types。如果这是一个用于监听的地址,它将尝试服务多个连接。
<addr2> 在高级模式下,要连接的第二个地址。如果这是一个用于监听的地址,它将只接受一个连接。
基本示例:
命令行WebSocket客户端:
websocat ws://ws.vi-server.org/mirror/
WebSocket服务器:
websocat -s 8080
WebSocket到TCP代理:
websocat --binary ws-l:127.0.0.1:8080 tcp:127.0.0.1:5678
地址类型完整列表:
ws:// 不安全(ws://)WebSocket客户端。参数为主机和URL。
wss:// 安全(wss://)WebSocket客户端。参数为主机和URL。
ws-listen: WebSocket服务器。参数为要监听的主机和端口。
inetd-ws: WebSocket inetd服务器。[A]
l-ws-unix: 基于UNIX套接字的WebSocket服务器。[A]
l-ws-abstract: WebSocket抽象命名空间UNIX套接字服务器。[A]
ws-lowlevel-client: [A] 低级HTTP独立WebSocket客户端连接,无关联的HTTP升级。
ws-lowlevel-server: [A] 低级HTTP独立WebSocket服务器连接,无关联的HTTP升级。
wss-listen: 在TCP端口监听安全WebSocket连接
http: [A] 发出HTTP请求,接收1xx或2xx响应,然后传递
asyncstdio: [A] 将标准输入和标准输出设置为非阻塞模式,然后用作通信对象。仅限UNIX。
inetd: 类似于`asyncstdio:`,但用于inetd(8)。[A]
tcp: 连接到指定的TCP主机和端口。参数为套接字地址。
tcp-listen: 在指定地址监听TCP端口。
ssl-listen: 在TCP端口监听SSL连接
sh-c: 使用`sh -c`启动指定的命令行(即使在Windows上)
cmd: 使用`sh -c`或`cmd /C`启动指定的命令行(取决于平台)
exec: 直接执行程序(不使用子shell),在Unix上提供参数数组 [A]
readfile: 同步读取文件。参数为文件路径。
writefile: 同步截断并写入文件。
appendfile: 同步追加文件。
udp: 从随机UDP端口向指定UDP套接字发送和接收数据包
udp-listen: 将UDP套接字绑定到指定的主机:端口,接收数据包
open-async: 打开文件以读写,并像套接字一样使用。[A]
open-fd: 将指定的文件描述符用作套接字。[A]
threadedstdio: [A] 标准输入/标准输出,生成线程(线程版本)。
- 从控制台读取输入,打印到控制台。除非通过`--async-stdio` CLI选项请求,否则即使在UNIX上也使用线程实现。
unix: 连接到UNIX套接字。参数为文件系统路径。[A]
unix-listen: 在指定的UNIX套接字上监听连接 [A]
unix-dgram: 向一个路径发送数据包,从另一个路径接收。[A]
abstract: 连接到UNIX抽象命名空间套接字。参数为用作地址的字符串。[A]
abstract-listen: 在指定的抽象UNIX套接字上监听连接 [A]
abstract-dgram: 向一个地址发送数据包,从另一个地址接收。[A]
mirror: 简单地将输出复制到输入。不需要参数。
literalreply: 对每个输入数据包回复指定字符串。
clogged: 什么都不做。不读取或写入任何字节。保持连接处于"挂起"状态。[A]
literal: 输出字符串,丢弃输入。
assert: 检查输入。[A]
assert2: 检查输入。[A]
seqpacket: 连接到AF_UNIX SOCK_SEQPACKET套接字。参数为文件系统路径。[A]
seqpacket-listen: 在指定的AF_UNIX SOCK_SEQPACKET套接字上监听连接 [A]
random: 被读取时生成随机字节,丢弃写入的字节。
重叠层完整列表:
ws-upgrade: WebSocket升级器/原始服务器。指定您自己的协议而不是通常的TCP。[A]
http-request: [A] 发出HTTP请求,接收1xx或2xx响应,然后传递
http-post-sse: [A] 接受HTTP/1请求。然后,如果是GET,
ssl-connect: 在现有连接之上添加TLS加密的重叠层 [A]
ssl-accept: 使用任意后备流接受TLS连接。[A]
reuse-raw: 重用子指定符以服务多个客户端:不可预测模式。[A]
broadcast: 重用此连接以服务多个客户端,将回复发送给所有客户端。
autoreconnect: 在任何错误或EOF时重新建立底层连接
ws-c: 低级WebSocket连接器。参数为其他地址。[A]
msg2line: 行过滤器:将数据包流中的消息转换为字节流的行。[A]
line2msg: 行过滤器:将字节流中的行转换为由'\n'或'\0'分隔的消息 [A]
lengthprefixed: 将字节流转换为/从带有长度前缀帧的数据包。[A]
foreachmsg: 为每个传入消息执行操作。
log: 记录通过底层连接器的每个缓冲区。
jsonrpc: [A] 将像`abc 1,2`这样的消息转换为`{"jsonrpc":"2.0","id":412, "method":"abc", "params":[1,2]}`。
timestamp: [A] 在每个传入消息前添加时间戳。
socks5-connect: SOCKS5代理客户端(原始)[A]
socks5-bind: SOCKS5代理客户端(原始,bind命令)[A]
crypto: [A] 使用静态密钥加密写入的消息并解密(并验证)读取的消息,使用ChaCha20-Poly1305算法。
prometheus: [A] 统计连接、消息、字节和其他数据,并在单独的端口上公开Prometheus指标。
exit_on_specific_byte: [A] 将特定字节转换为EOF,允许用户退出交互式Websocat会话
waitfordata: 在开始连接之前等待一些数据待写入。[A]
一些注意事项
---
* 支持IPv6,根据上下文将IP地址用方括号括起来或直接使用。
* 不强制使用Web套接字,您可以在两端使用任何规格。
* 通常,二进制流中的一行对应一个WebSocket文本消息。这可以通过选项进行调整。
限制
---
* 它只连接(或服务)HTTP/1。目前不支持[RFC 8441](https://www.rfc-editor.org/rfc/rfc8441)或[RFC 9220](https://www.rfc-editor.org/rfc/rfc9220.html)。
* 当混合使用文本和二进制WebSocket消息时不太方便。这会影响`mirror:`指定符,使其与ws://echo.websocket.org略有不同。有`--binary-prefix`、`--text-prefix`和`--base64`选项来处理二进制和文本的混合。
* Websocat的当前版本不会收到关于已关闭套接字的通知。这使得在没有`-E`或`-u`选项或在背压场景下的服务容易出现套接字泄漏。
* 未集成readline。建议用户使用[`rlwrap`](https://linux.die.net/man/1/rlwrap)工具包装websocat,以获得更方便的CLI。
* Websocat当前版本的构建过程未得到适当自动化,且较为脆弱。
另请参阅
---
* [wstunnel](https://github.com/erebe/wstunnel)
* [wscat](https://github.com/websockets/wscat)
* [websocketd](https://github.com/joewalnes/websocketd)
* [wsd](https://github.com/alexanderGugel/wsd)