Node.js LinuxBash:如何作为客户端打开websocket连接

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/ 编辑: 我的问题已被确定为可能重复的问题。然

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

如何仅使用linux命令行工具连接到web套接字? 我已经试过按描述卷曲。但是,我无法找到如何正确连接到在localhost:8088/socket上运行的websocket/

编辑: 我的问题已被确定为可能重复的问题。然而,链接的问题只询问是否有一种方法可以通过curl实现。我很高兴看到任何在bash上有效的解决方案。此外,链接问题的答案是一个使用autobahn.ws的javascript文件,请在此处尝试此文件:

他从这里得到:

要在将来引用此网站的内容,请执行以下操作:

这些旗帜上写着:

  • 在输出中返回标题
  • 不要缓冲响应
  • 设置此连接需要从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
    
    我的工具是专门为此设计的

    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 ...                |
     +---------------------------------------------------------------+