我已经创建了一个Node.JS应用程序,它提供了一个Web Socket服务器(使用npm ws)。这个web套接字等待连接建立。一旦连接到达服务器,web套接字就执行一个作业。当作业完成时,通过套接字发送一个消息,然后关闭套接字。这个套接字按预期工作;我已经用另一个Node.JS脚本测试过了。
我如何只使用linux命令行**工具连接到Web Socket*?我已经尝试了here所述的curl。但是,我找不到如何正确连接到运行在localhost:8088/socket/的websocket
**编辑:**我的问题被认为可能与another问题重复。但是,链接的问题只问是否有一种方法可以用curl来完成。我很高兴看到任何可以在bash上工作的解决方案。另外,链接问题的答案是一个javascript文件,使用autobahn.ws
5条答案
按热度按时间gdrx4gfi1#
我的工具websocat就是专门为此设计的。
您可以连接到服务器并与之交换数据。默认情况下,每一行都变成一条WebSocket文本消息,反之亦然。
在Linux上,使用readline操作它会更方便:
它并不是唯一的CLI WebSocket客户端,还有“ws”和“wscat”项目。
jmp7cifd2#
从这里试试这个:How to hit the WebSocket Endpoint?
他在这里有:http://www.thenerdary.net/post/24889968081/debugging-websockets-with-curl
引用本网站的内容以备将来使用:
那些旗子写着:
1.在输出中返回标头
1.不缓冲响应
1.设置此连接从HTTP升级到其他连接所需的标头
1.设置此连接升级为WebSocket连接所需的标头
1.设置一个标头来定义主机(以后的WebSocket标准需要)
1.设置一个标头来定义请求的来源(以后的WebSocket标准要求)
如果WebSocket正常工作,它应该返回以下内容:
iibxawm43#
vianswer提供了一个非常有用的工具,
websocat
是如此容易使用。我只想用
bash
内置函数来实现,我认为它对其他人更好地理解协议是有用的。websocket protocol握手很简单。
要在bash中打开
tcp
通道,可以使用:然后,我们可以使用文件描述符
&3
读取和写入数据到该tcp
连接。首先,让我们打开一个读取通道:
我们并不真的需要替换回车字节
\r
,但是如果我们不这样做,终端输出会很奇怪。每个websocket服务器实现可能需要特定的细节。www.example.com需要
Origin
标头和\r
字节在结束行之前。websocket.org requiresOrigin
header and\r
byte before end line.然后我们可以启动连接
upgrade
:立即我们看到ws升级输出:
你看到
Sec-WebSocket-Accept
头了吗?服务器按照RFC 6455中的描述解析它。我们可以计算它:我知道......
cut
、xxd
、base64
和sha1sum
不是内置的,但此确认步骤只是为了澄清。握手已经完成,我们tcp连接现在升级为websocket连接。
现在是最难的部分。
我们需要发送数据。我们可以在RFC6455的第5节中学习如何发送数据。
客户端必须屏蔽它发送到服务器的所有帧(更多细节请参见第5.3节)
以及
服务器必须在收到未屏蔽的帧时关闭连接
阅读RFC第5.2节了解如何屏蔽数据。
RFC甚至为数据屏蔽提供了一种方法:
我想写一个bash函数来屏蔽ws数据,但是我现在做不到。我稍后会更新这篇文章。
monwx1rj4#
我一直在使用wscat,一个npm包。
发布时软件包自述文件中的说明:
安装
此模块需要全局安装,因此在安装时使用-g标志:
示例
vuktfyat5#
curl -H 'Upgrade: websocket' -H "Sec-WebSocket-Key:
openssl rand -base64 16" -H 'Sec-WebSocket-Version: 13' --http1.1 -sSv https://ws.ifelse.io
(取决于您可能需要提供Origin
和/或Connection: Upgrade
的服务器)首先,Websocket协议是如何工作的?客户端连接到服务器,发送握手请求,接收"101交换协议"(握手响应),之后他们来回发送帧。
握手过程如下:
Upgrade
使其从HTTP(s)切换到websocket协议。Connection
指定Upgrade
是一个逐跳报头(中介应该使用而不是转发的报头),但我的实验表明,没有这个报头也可以工作,或者更准确地说,如果服务器前面有一个反向代理(例如nginx
),它可能是可选的。Sec-WebSocket-Key
/Sec-WebSocket-Accept
是这里、这里和这里描述的安全措施。Sec-WebSocket-Version
指定websocket协议版本。根据RFC 6455,它应该等于13。当客户端是浏览器并且请求页面的来源与websocket服务器URL的来源不匹配时,需要
Origin
。关于websocket握手请求的详细描述可以在这里找到。
HTTP/1.1就是这样的,HTTP/2是一个different story。
了解这一点后,可以使用
curl
建立websocket连接:其他选项为
wscat
、websocat
。