使用 websockify 的网络服务器 "websocket wrapping" 的最小示例
Minimal example of "websocket wrapping" for web server using websockify
菜鸟的一些 webdev 基本问题。
背景:我有一个使用websocket协议的java脚本客户端,还有一个很好的旧java 服务器,我完全可以通过 telnet
与之交互。我希望他们能够在本地相互通信(传递字符串就足够了)。
为此,我绝对不想对客户端进行深入更改。在此之前,我尝试按照 this 指南使服务器适应 websocket,甚至通过了握手,但它变得非常混乱。
所以在这一点上,我认为处理这个问题的最佳方法是通过 TCP->WebSocket 代理服务,例如 websockify. If I got the explanation 对,它会 "wrap" 服务器的进程,打开新端口中的 "upgraded" 连接。 websocket 客户端应该能够通过该端口直接与服务器通信。但是我一直在尝试用不同的方法来实现这个但没有成功,因此我的 questions:
- 有没有更好的方法来处理这个问题? (这可以解释 google 的稀疏性,我可以想象这种情况经常发生!)
- 如果"wrapping"是最好的方法而且我做对了,如何实施?
实施 - 已编辑:为了测试,我尝试构建一个简单的回显服务器:
我运行正在使用 this post: ncat -l 2000 -k -c xargs -n1 echo
中建议的非常简单的命令行回显服务器。通过 telnet localhost 2000
returns 与它交谈所需的回声。到目前为止一切顺利。
我使用 apt-get
安装了 websockify,运行 安装如下:websockify 2023: 2000
,这应该通过 websocket 连接打开同一个服务器在端口 2023 上。
此时我仍然可以通过 telnet localhost 2000
进行通信,但我对端口 2023 的运气不佳。这是我到目前为止尝试过的方法:
- 下载了 telsocket 二进制文件,并调用了
./telsocket -url ws://127.0.0.1:2023
。 响应:errrr dial tcp 127.0.0.1:2023: connection refused
- Cloneed wssh(用于 websocket 的命令行 shell),这看起来很有前途。我能够安装它,但是 运行ning
wssh -l localhost:2023
returns NameError: name 'PROTOCOL_SSLv3' is not defined
。显然 gevent
存在一些问题(没有深入研究)。
- 测试了
websockify
的 repo 中的几个示例,例如 wstelnet, or the ones in tests。他们都给我一个 代码 400,消息 Invalid protocol selected。
后续 - 已编辑:深入研究 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:
备注:因为它打算在本地工作,所以我不在乎 ws
或 wss
。只要可行且有效,我也没有首选方法。如果相关,我在 Ubuntu15.10 + Firefox47.0
最后,我让 TCP 回显服务器通过 websockify 的代理与 websockify 的 websocket telnet emulator 通信。是这样的:
- 运行回显服务器
ncat -l 2000 -k -c 'xargs -n1 echo echoServer received'
- 在单独的进程中,运行 代理:
websockify 2023 :2000
克隆存储库: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);
this is a conversion to Array 因为 Uint8Array 显然不支持 shift
方法。
用 firefox 打开 wstelnet.html,select 主机:本地主机,端口: 2023,无加密,按 连接 并在黑色字段中输入。
屏幕应回复 echoServer received: <YOUR_MESSAGE>
。 hurray!
菜鸟的一些 webdev 基本问题。
背景:我有一个使用websocket协议的java脚本客户端,还有一个很好的旧java 服务器,我完全可以通过 telnet
与之交互。我希望他们能够在本地相互通信(传递字符串就足够了)。
为此,我绝对不想对客户端进行深入更改。在此之前,我尝试按照 this 指南使服务器适应 websocket,甚至通过了握手,但它变得非常混乱。
所以在这一点上,我认为处理这个问题的最佳方法是通过 TCP->WebSocket 代理服务,例如 websockify. If I got the explanation 对,它会 "wrap" 服务器的进程,打开新端口中的 "upgraded" 连接。 websocket 客户端应该能够通过该端口直接与服务器通信。但是我一直在尝试用不同的方法来实现这个但没有成功,因此我的 questions:
- 有没有更好的方法来处理这个问题? (这可以解释 google 的稀疏性,我可以想象这种情况经常发生!)
- 如果"wrapping"是最好的方法而且我做对了,如何实施?
实施 - 已编辑:为了测试,我尝试构建一个简单的回显服务器:
我运行正在使用 this post:
ncat -l 2000 -k -c xargs -n1 echo
中建议的非常简单的命令行回显服务器。通过telnet localhost 2000
returns 与它交谈所需的回声。到目前为止一切顺利。我使用
apt-get
安装了 websockify,运行 安装如下:websockify 2023: 2000
,这应该通过 websocket 连接打开同一个服务器在端口 2023 上。此时我仍然可以通过
telnet localhost 2000
进行通信,但我对端口 2023 的运气不佳。这是我到目前为止尝试过的方法:- 下载了 telsocket 二进制文件,并调用了
./telsocket -url ws://127.0.0.1:2023
。 响应:errrr dial tcp 127.0.0.1:2023: connection refused
- Cloneed wssh(用于 websocket 的命令行 shell),这看起来很有前途。我能够安装它,但是 运行ning
wssh -l localhost:2023
returnsNameError: name 'PROTOCOL_SSLv3' is not defined
。显然gevent
存在一些问题(没有深入研究)。 - 测试了
websockify
的 repo 中的几个示例,例如 wstelnet, or the ones in tests。他们都给我一个 代码 400,消息 Invalid protocol selected。
- 下载了 telsocket 二进制文件,并调用了
后续 - 已编辑:深入研究 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:
备注:因为它打算在本地工作,所以我不在乎 ws
或 wss
。只要可行且有效,我也没有首选方法。如果相关,我在 Ubuntu15.10 + Firefox47.0
最后,我让 TCP 回显服务器通过 websockify 的代理与 websockify 的 websocket telnet emulator 通信。是这样的:
- 运行回显服务器
ncat -l 2000 -k -c 'xargs -n1 echo echoServer received'
- 在单独的进程中,运行 代理:
websockify 2023 :2000
克隆存储库:
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);
this is a conversion to Array 因为 Uint8Array 显然不支持shift
方法。用 firefox 打开 wstelnet.html,select 主机:本地主机,端口: 2023,无加密,按 连接 并在黑色字段中输入。
屏幕应回复 echoServer received: <YOUR_MESSAGE>
。 hurray!