我创建了一个Node.JS应用程序,它提供了一个Web套接字服务器(使用npm ws)。这个websocket等待直到建立连接。一旦连接到达服务器,websocket就会执行一项工作。作业完成后,将通过套接字发送消息,然后关闭套接字。 这个插座按预期工作;已经使用另一个Node.JS脚本对其进行了测试。
如何仅使用linux 命令行工具连接到网络套件? 我已按照here所述尝试过curl。但是,我无法找到如何正确连接到我在localhost上运行的websocket:8088 / socket /
修改 我的问题已被确定为another问题的可能重复。但是,链接的问题只询问是否有办法使用curl。我很高兴看到任何解决方案适用于bash。此外,链接问题的答案是使用autobahn.ws
的javascript文件答案 0 :(得分:7)
从这里试试这个:How to hit the WebSocket Endpoint?
$ 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://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
答案 1 :(得分:4)
我的工具websocat专为此设计。
websocat ws://your_server/url
您可以与服务器连接并交换数据。默认情况下,每一行都将成为WebSocket文本消息,反之亦然。
在Linux上,使用readline玩起来更舒服:
rlwrap websocat ws://your_server/url.
它不是唯一的CLI Websocket客户端。还有“ ws”和“ wscat”项目。
答案 2 :(得分:0)
vi answer提供了非常有用的工具。 websocat
非常易于使用。
我只想使用bash
内置函数来做。我认为对其他人更好地理解协议可能很有用。
websocket protocol握手很简单。
要在bash中打开tcp
频道,我们可以使用:
wshost=echo.websocket.org
wsport=80
exec 3<>/dev/tcp/${wshost}/${wsport}
然后,我们可以使用文件描述符tcp
向该&3
连接读写数据。
首先让我们打开一个阅读频道:
CR=$(echo -en "\r")
while read <&3; do echo "WS MSG:[${REPLY//$CR/}]"; done &
我们确实不需要替换回车字节\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
立即我们看到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:[]
您看到Sec-WebSocket-Accept
标头吗?服务器按照RFC 6455中的说明进行解析。我们可以使用以下方法进行计算:
$ echo -n "$(echo -n "somekey" | base64)258EAFA5-E914-47DA-95CA-C5AB0DC85B11" |
sha1sum | cut -d " " -f1 | xxd --ps -r | base64
eXT5yQBZ/TOhFBUi6nLY8cfzs1s=
我知道... cut
,xxd
,base64
和sha1sum
不是内置的,但是此验证步骤只是为了澄清。
握手已完成,我们的tcp连接现在已升级为websocket连接。
现在是最困难的部分。
我们需要发送数据。我们可以在section 5 of the RFC6455中学习如何做。
客户端必须屏蔽其发送到服务器的所有帧(有关更多详细信息,请参见第5.3节)
和
服务器必须在收到未屏蔽的帧后关闭连接
Read the RFC Section 5.2 to know how to mask data.
RFC甚至提供了一种用于数据屏蔽的ascii艺术:
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 ... |
+---------------------------------------------------------------+
我想编写一个bash函数来掩盖ws数据,但是我现在不能这样做。我将在稍后更新此帖子。