Node.js LinuxBash:如何作为客户端打开websocket连接
我创建了一个Node.JS应用程序,它提供了一个web套接字服务器(使用)。此websocket将等待连接建立。一旦连接到达服务器,websocket就会执行作业。作业完成后,通过套接字发送消息,然后关闭套接字。 这个插座工作正常;已经用另一个Node.JS脚本对其进行了测试 如何仅使用linux命令行工具连接到web套接字? 我已经试过按描述卷曲。但是,我无法找到如何正确连接到在localhost:8088/socket上运行的websocket/ 编辑: 我的问题已被确定为可能重复的问题。然而,链接的问题只询问是否有一种方法可以通过curl实现。我很高兴看到任何在bash上有效的解决方案。此外,链接问题的答案是一个使用autobahn.ws的javascript文件,请在此处尝试此文件: 他从这里得到: 要在将来引用此网站的内容,请执行以下操作: 这些旗帜上写着:Node.js LinuxBash:如何作为客户端打开websocket连接,node.js,linux,bash,curl,websocket,Node.js,Linux,Bash,Curl,Websocket,我创建了一个Node.JS应用程序,它提供了一个web套接字服务器(使用)。此websocket将等待连接建立。一旦连接到达服务器,websocket就会执行作业。作业完成后,通过套接字发送消息,然后关闭套接字。 这个插座工作正常;已经用另一个Node.JS脚本对其进行了测试 如何仅使用linux命令行工具连接到web套接字? 我已经试过按描述卷曲。但是,我无法找到如何正确连接到在localhost:8088/socket上运行的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
我的工具是专门为此设计的
websocat ws://your_server/url
您可以与服务器连接并交换数据。默认情况下,每一行都成为WebSocket文本消息,反之亦然
在Linux上,使用readline玩起来更舒服:
rlwrap websocat ws://your_server/url.
它不是唯一的CLI websocket客户端。还有“ws”和“wscat”项目。提供了一个非常有用的工具website
非常容易使用
我只想用bash
builtins来实现它。我认为,更好地理解该协议对其他人可能是有益的
握手很容易
要在bash中打开tcp
通道,我们可以使用:
wshost=echo.websocket.org
wsport=80
exec 3/dev/tcp/${wshost}/${wsport}
然后,我们可以使用文件描述符&3
向该tcp
连接读写数据
首先,让我们打开一个阅读频道:
CR=$(echo-en“\r”)
边读边读&3
i我们立即看到ws-upgrade输出:
$ 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
标题了吗?服务器将按照中所述对其进行解析。我们可以用以下公式计算:
$echo-n“$(echo-n“somekey”| base64)258EAFA5-E914-47DA-95CA-C5AB0DC85B11”|
sha1sum | cut-d”“-f1 | xxd--ps-r | base64
eXT5yQBZ/TOHFBUILY6CFZS1=
我知道cut
、xxd
、base64
和sha1sum
不是内置的,但此验证步骤仅用于澄清
握手完成了,我们的tcp连接现在升级到websocket连接
现在是最难的部分
我们需要发送数据。我们可以在家里学习如何做
客户端必须屏蔽它发送到服务器的所有帧(有关更多详细信息,请参阅第5.3节)
及
服务器必须在收到未屏蔽的帧时关闭连接
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-data,但现在不行。我将在稍后更新此帖子。可能重复。。。我已经在我的问题中提到了:不,我不能让它与localhost一起工作。我在我的express.js webserver上收到一个HTTP/1.1400错误请求内容类型:text/html噢,对不起!也许你需要自己处理更新请求?如果服务器只为ws协议服务?因为如果我理解正确的话,curl请求会尝试执行http并将其更新为ws协议-但是如果Web服务器不接受http传入调用,则不会发生任何事情,所以我考虑了您所说的。我以前没听说过这种升级机制。然而,这当然可能是它不起作用的原因;)因此,我现在已经将node.js应用程序上传到一家在线云提供商。因此,我现在有了一个http url。我想我的express.js框架也可以在内部使用升级机制。如何将路径和端口添加到curl命令?好的。我很好奇如果在升级后建立连接会发生什么。因为它是一个双向流,所以它必须以某种方式在终端中打开。但是怎么做呢?会发生什么?然后我尝试了这个,得到了这个:
curl:(1)libcurl中不支持或禁用协议“ws”:curl-I-N-H“连接:升级”-H“升级:websocket”-H“主机:echo.websocket.org”-H”来源:http://www.websocket.org“ws://echo.websocket.org/
好的,因此,回答您的问题:我认为在升级linux curl工具之后,您不可能走那么远的路来进行通信。既然您询问了linux工具
,也许可以安装类似的东西,然后从命令行(可以处理协议)运行Hi!谢谢你的工具。是否可以无许可安装它?在办公室我们没有sudoaccess@GeorgiosPligoropoulos是的,只需从Github发行版下载适当的预构建可执行文件并运行即可。可以运行多个变体。您还可以下载并解压缩deb包。当我尝试:website-H“Authorization:Bearer…”ws://server/url
,我会收到帮助消息。此工具似乎无法处理对带有选项的web套接字的侦听。@此模式下的NicolasRouquette应在要连接的URL之后指定选项。请注意,用于侦听和连接的标头是单独的选项。
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 ... |
+---------------------------------------------------------------+