Bri*_*ian 9 linux bash curl websocket node.js
我创建了一个Node.JS应用程序,它提供了一个Web套接字服务器(使用npm ws).这个websocket等待直到建立连接.一旦连接到达服务器,websocket就会执行一项工作.作业完成后,将通过套接字发送消息,然后关闭套接字.这个插座按预期工作; 已经使用另一个Node.JS脚本对其进行了测试.
如何仅使用linux 命令行工具连接到Web套接字?描述我已经尝试过卷曲这里.但是,我无法找到如何正确连接到我在localhost上运行的websocket:8088/socket /
编辑: 我的问题已被确定为另一个问题的可能重复.但是,链接的问题只询问是否有办法使用curl.我很高兴看到任何解决方案适用于bash.此外,链接问题的答案是使用autobahn.ws的javascript文件
小智 11
我一直在使用 wscat,一个 npm 包。https://github.com/websockets/wscat。
发布时包自述文件中的说明:
该模块需要全局安装,因此在安装时使用 -g 标志:
npm install -g wscat
Run Code Online (Sandbox Code Playgroud)
$ wscat -c ws://echo.websocket.org
Connected (press CTRL+C to quit)
> hi there
< hi there
> are you a happy parrot?
< are you a happy parrot?
Run Code Online (Sandbox Code Playgroud)
ton*_*ton 10
该VI 的答案提供了一个非常有用的工具。websocat非常容易使用。
我只想用bash内置函数来做。我认为对其他人更好地理解协议很有用。
所述WebSocket协议握手是容易的。
要tcp在 bash 中打开一个频道,我们可以使用:
wshost=echo.websocket.org
wsport=80
exec 3<>/dev/tcp/${wshost}/${wsport}
Run Code Online (Sandbox Code Playgroud)
然后我们可以tcp使用文件描述符读取和写入数据到该连接&3。
首先让我们打开一个读取通道:
CR=$(echo -en "\r")
while read <&3; do echo "WS MSG:[${REPLY//$CR/}]"; done &
Run Code Online (Sandbox Code Playgroud)
我们真的不需要替换回车字节\r,但是如果我们不替换,终端输出会很奇怪。
每个 websocket 服务器实现都可能需要特定的细节。websocket.org在结束行之前需要Origin头和\r字节。
然后我们可以开始连接upgrade:
echo -e "GET / HTTP/1.1\r
Host: ${wshost}\r
Connection: Upgrade\r
Upgrade: websocket\r
Sec-WebSocket-Accept: $(echo -n "somekey"|base64)\r
Origin: http://www.websocket.org\r
\r" >&3
Run Code Online (Sandbox Code Playgroud)
我们立即看到 ws 升级输出:
$ WS MSG:[HTTP/1.1 101 Web Socket Protocol Handshake]
WS MSG:[Access-Control-Allow-Credentials: true]
WS MSG:[Access-Control-Allow-Headers: content-type]
WS MSG:[Access-Control-Allow-Headers: authorization]
WS MSG:[Access-Control-Allow-Headers: x-websocket-extensions]
WS MSG:[Access-Control-Allow-Headers: x-websocket-version]
WS MSG:[Access-Control-Allow-Headers: x-websocket-protocol]
WS MSG:[Access-Control-Allow-Origin: http://www.websocket.org]
WS MSG:[Connection: Upgrade]
WS MSG:[Date: Thu, 29 Oct 2020 15:08:01 GMT]
WS MSG:[Sec-WebSocket-Accept: eXT5yQBZ/TOhFBUi6nLY8cfzs1s=]
WS MSG:[Server: Kaazing Gateway]
WS MSG:[Upgrade: websocket]
WS MSG:[]
Run Code Online (Sandbox Code Playgroud)
你看到Sec-WebSocket-Accept标题了吗?服务器按照RFC 6455 中的描述解析它。我们可以用以下方法计算:
$ WS MSG:[HTTP/1.1 101 Web Socket Protocol Handshake]
WS MSG:[Access-Control-Allow-Credentials: true]
WS MSG:[Access-Control-Allow-Headers: content-type]
WS MSG:[Access-Control-Allow-Headers: authorization]
WS MSG:[Access-Control-Allow-Headers: x-websocket-extensions]
WS MSG:[Access-Control-Allow-Headers: x-websocket-version]
WS MSG:[Access-Control-Allow-Headers: x-websocket-protocol]
WS MSG:[Access-Control-Allow-Origin: http://www.websocket.org]
WS MSG:[Connection: Upgrade]
WS MSG:[Date: Thu, 29 Oct 2020 15:08:01 GMT]
WS MSG:[Sec-WebSocket-Accept: eXT5yQBZ/TOhFBUi6nLY8cfzs1s=]
WS MSG:[Server: Kaazing Gateway]
WS MSG:[Upgrade: websocket]
WS MSG:[]
Run Code Online (Sandbox Code Playgroud)
我知道... cut, xxd,base64和sha1sum不是内置的,但这个验证步骤只是为了澄清。
握手完成,我们的 tcp 连接现在升级为 websocket 连接。
现在是困难的部分。
我们需要发送数据。我们可以在 RFC6455 的第 5 节中了解如何做到这一点。
客户端必须屏蔽它发送到服务器的所有帧(有关详细信息,请参阅第 5.3 节)
和
服务器必须在收到未屏蔽的帧时关闭连接
RFC 甚至提供了一种用于数据屏蔽的 ascii-art:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
我想写一个 bash 函数来屏蔽 ws 数据,但我现在不能这样做。我稍后会更新这篇文章。
我的工具websocat是专门为此设计的。
websocat ws://your_server/url
Run Code Online (Sandbox Code Playgroud)
您可以与服务器连接并交换数据。默认情况下,每一行都将成为WebSocket文本消息,反之亦然。
在Linux上,使用readline玩起来更舒服:
rlwrap websocat ws://your_server/url.
Run Code Online (Sandbox Code Playgroud)
它不是唯一的CLI Websocket客户端。也有“ ws”和“ wscat”项目。
从这里试试这个:如何点击WebSocket端点?
$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: echo.websocket.org" -H "Origin: http://www.websocket.org" http://echo.websocket.org
Run Code Online (Sandbox Code Playgroud)
他来自这里:http://www.thenerdary.net/post/24889968081/debugging-websockets-with-curl
引用本网站的内容以供将来使用:
那些旗帜说:
- 返回输出中的标题
- 不要缓冲响应
- 设置此连接需要从HTTP升级到其他内容的标头
- 设置此连接需要升级到WebSocket连接的标头
- 设置标头以定义主机(以后的WebSocket标准要求)
- 设置标头以定义请求的来源(以后的WebSocket标准要求)
如果websocket正在运行,它应该返回以下内容:
$ curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" -H "Host: echo.websocket.org" -H "Origin:http://www.websocket.org" http://echo.websocket.org
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
WebSocket-Origin: http://www.websocket.org
WebSocket-Location: ws://echo.websocket.org/
Server: Kaazing Gateway
Date: Mon, 11 Jun 2012 16:34:46 GMT
Access-Control-Allow-Origin: http://www.websocket.org
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Headers: authorization
Access-Control-Allow-Headers: x-websocket-extensions
Access-Control-Allow-Headers: x-websocket-version
Access-Control-Allow-Headers: x-websocket-protocol
Run Code Online (Sandbox Code Playgroud)