javascript - 使用 websockify 的 Web 服务器的 "websocket wrapping"的最小示例

标签 javascript websocket websockify

菜鸟的一些 webdev 基本问题。

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

为此,我绝对不想对客户端进行深入的更改。我尝试按照 this 将服务器调整为 websocket在此之前进行了指导,甚至还通过了握手,但它变得非常困惑。

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


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

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

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

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

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

    • 已下载 telsocket二进制文件,名为 ./telsocket -url ws://127.0.0.1:2023响应:errrr 调用 tcp 127.0.0.1:2023:连接被拒绝
    • 克隆 wssh (websocket 的命令行 shell),这看起来很有前途。我能够安装它,但运行 wssh -l localhost:2023 返回 NameError: name 'PROTOCOL_SSLv3' is not Define。显然 gevent 存在一些问题(没有进一步研究)。
    • 测试了 websockify 存储库中的几个示例,例如 wstelnet ,或者 tests 中的那些。他们都给了我一个代码 400,消息选择了无效协议(protocol)

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

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

最佳答案

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

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

    3.1 换线ws.open(uri)ws.open(uri, "binary")允许克服代码 400 问题。

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

  4. 打开wstelnet.html使用 Firefox,选择主机:localhost,端口: 2023,不加密,按连接并在黑色字段中键入。

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

关于javascript - 使用 websockify 的 Web 服务器的 "websocket wrapping"的最小示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798652/

相关文章:

javascript - 跨浏览器选项卡共享 websocket?

objective-c - WebSocket 连接未使用 SocketRocket 关闭

javascript - 使用formdata获取数据?

python-3.x - websocket握手源代码中的梯子和雷达是什么

javascript - jquery : Setting value in hidden input upon onchange event

ssl - noVNC websockify ssl

c++ - 如何在同一端口上运行套接字和 websocket 服务器?

iis - IIS 8中的Websockets反向代理

javascript - Bootstrap : Better way of lining up elements in columns and rows when you have to skip some

javascript - 添加从 mongoDB 中删除记录的自动化过程的最佳方法是什么?