Linux Bash:如何打开websocket连接作为客户端

时间:2016-12-01 10:15:57

标签: node.js linux bash curl websocket

我创建了一个Node.JS应用程序,它提供了一个Web套接字服务器(使用npm ws)。这个websocket等待直到建立连接。一旦连接到达服务器,websocket就会执行一项工作。作业完成后,将通过套接字发送消息,然后关闭套接字。 这个插座按预期工作;已经使用另一个Node.JS脚本对其进行了测试。

如何仅使用linux 命令行工具连接到网络套件? 我已按照here所述尝试过curl。但是,我无法找到如何正确连接到我在localhost上运行的websocket:8088 / socket /

修改 我的问题已被确定为another问题的可能重复。但是,链接的问题只询问是否有办法使用curl。我很高兴看到任何解决方案适用于bash。此外,链接问题的答案是使用autobahn.ws

的javascript文件

3 个答案:

答案 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

引用本网站的内容以供将来使用:

  

那些旗帜说:

     
      
  1. 在输出中返回标题
  2.   
  3. 不缓冲响应
  4.   
  5. 设置此连接需要从HTTP升级到其他内容的标头
  6.   
  7. 设置此连接需要升级到WebSocket连接的标头
  8.   
  9. 设置标题以定义主机(以后的WebSocket标准所需)
  10.   
  11. 设置标题以定义请求的来源(以后的WebSocket标准所需)
  12.   

如果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=

我知道... cutxxdbase64sha1sum不是内置的,但是此验证步骤只是为了澄清。

握手已完成,我们的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数据,但是我现在不能这样做。我将在稍后更新此帖子。