【问题标题】:Minimal example of "websocket wrapping" for web server using websockify使用 websockify 的 Web 服务器的“websocket 包装”的最小示例
【发布时间】:2017-08-05 12:52:13
【问题描述】:

一些针对菜鸟的 webdev 基本问题。

背景:我有一个使用 websocket 协议的 javascript 客户端和一个很好的旧 java 服务器,我完全可以通过 telnet 与之交互.我希望他们能够在本地相互通信(传递字符串就足够了)。

为此,我绝对不想在客户端中进行深度更改。在此之前,我尝试按照this 指南使服务器适应websocket,甚至通过了握手,但它变得非常混乱。

所以在这一点上,我认为处理这个问题的最佳方法是通过 TCP->WebSocket 代理(如websockify)提供服务。如果我得到explanation 正确,它将“包装”服务器的进程,在新端口中打开“升级”连接。 websocket 客户端应该能够通过该端口直接与服务器通信。但我一直在尝试用不同的方法来实现这一点,但没有成功,因此我的问题


  • 有没有更好的方法来处理这个问题? (这可以解释谷歌的稀疏性,我可以想象这种情况经常发生!)
  • 如果“包装”是最好的方法并且我做对了,如何实施?

实现 - 编辑:为了测试,我尝试构建一个简单的回显服务器:

  • 我正在运行this 帖子中建议的非常简单的命令行回显服务器:ncat -l 2000 -k -c xargs -n1 echo。通过telnet localhost 2000 与其交谈会返回所需的回声。到目前为止一切顺利。

  • 我使用apt-get安装了websockify,运行如下:websockify 2023: 2000,这应该通过端口2023上的websocket连接打开同一个服务器。

  • 此时我仍然可以通过telnet localhost 2000 进行通信,但我在 2023 端口上没有那么幸运。这是我迄今为止尝试过的:

    • 下载了telsocket 二进制文件,并调用了./telsocket -url ws://127.0.0.1:2023回复:errrr dial tcp 127.0.0.1:2023: connection refused
    • 克隆了wssh(websocket 的命令行shell),看起来很有希望。我能够安装它,但运行 wssh -l localhost:2023 返回 NameError: name 'PROTOCOL_SSLv3' is not defined。显然gevent 存在一些问题(没有进一步研究)。
    • 测试了websockify 的repo 中的几个示例,例如wstelnet,或tests 中的示例。他们都给了我一个代码 400,消息选择了无效协议

后续 - 已编辑:深入研究 websock.js 和 wstelnet.js files,通过向 JS 控制台发出以下命令,我能够获得更具体的结果: p>

ws = new Websock()
ws.open("ws://127.0.0.1:2023", "binary") // connects, proxy says: connecting to: :2000, Plain non-SSL (ws://) WebSocket connection, Version hybi-13, base64: 'False'
ws.send_string("hello server")           // send and wait for echo 
ws.get_rQ()                              // empty??

所以,如您所见,我能够建立连接,但仍然没有得到回显。错误也可能出现在服务器端,因为我尝试的每个工具都失败了。帮助! D:


备注:因为它打算在本地工作,所以我不在乎wswss。只要可行且有效,我也没有首选的方法来执行此操作。如果它是相关的,我在 Ubuntu15.10 + Firefox47.0

【问题讨论】:

    标签: javascript websocket websockify


    【解决方案1】:

    最后,我让 TCP 回显服务器通过 websockify 的代理与 websockifywebsocket telnet emulator 通信。方法如下:

    1. 运行回显服务器ncat -l 2000 -k -c 'xargs -n1 echo echoServer received'
    2. 在单独的进程中,运行代理:websockify 2023 :2000
    3. 克隆 repo:git clone https://github.com/novnc/websockify.git,并对 wstelnet.js 进行以下更改:

      3.1 将行 ws.open(uri) 更改为 ws.open(uri, "binary") 允许克服 code 400 问题。

      3.2 在definition of do_recv(这是一个永久链接)中,在最初的var 语句之后添加以下行:arr = Array.from(arr); 这是一个到 Array 的转换,因为 Uint8Array 显然不支持 shift 方法。

    4. 用firefox打开wstelnet.html,选择Host: localhost, Port: 2023,不加密,按Connect并输入进入黑色区域。

    屏幕应回复echoServer received: <YOUR_MESSAGE>hurray!

    【讨论】:

    • 我会暂时不接受这个,以防有人有更好的建议来解决这个问题。非常感谢用户 kanaka 提供了这款出色的软件
    • 这个博客证实这是处理这个问题的一个非常好的方法:barkingbogart.wordpress.com/2014/10/08/… 所以在几个星期没有进一步反应之后,我接受了我自己的答案
    猜你喜欢
    • 2012-01-06
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    • 2012-11-26
    • 2014-05-02
    • 1970-01-01
    相关资源
    最近更新 更多