菜鸟的一些 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)。
- 已下载 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 echo 服务器与 websockify 的 websocket telnet emulator 进行通信。通过websockify的代理。方法如下:
- 运行回显服务器
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);
这是对 Array 的转换,因为 Uint8Array 显然不支持shift
方法。打开wstelnet.html使用 Firefox,选择主机:localhost,端口: 2023,不加密,按连接并在黑色字段中键入。
里>
屏幕应回复 echoServer received: <YOUR_MESSAGE>
。 hurray!
关于javascript - 使用 websockify 的 Web 服务器的 "websocket wrapping"的最小示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42798652/