2

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

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

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

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


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

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

  • 我正在运行这篇文章中建议的非常简单的命令行回显服务器:ncat -l 2000 -k -c xargs -n1 echo. 通过与它交谈会telnet localhost 2000返回所需的回声。到目前为止,一切都很好。

  • 我使用安装了websockifyapt-get,并按如下方式运行它: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测试了's repo中的几个示例,例如wstelnettests中的示例。他们都给了我一个代码 400,消息 Invalid protocol selected

后续编辑:深入研究 websock.js 和 wstelnet.js文件,通过向 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??

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


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

4

1 回答 1

2

finally, I got the TCP echo server communicating with websockify's websocket telnet emulator through websockify's proxy. This is how:

  1. run the echo server ncat -l 2000 -k -c 'xargs -n1 echo echoServer received'
  2. in a separate process, run the proxy: websockify 2023 :2000
  3. clone the repo: git clone https://github.com/novnc/websockify.git, and make the following changes to wstelnet.js:

    3.1 changing the line ws.open(uri) to ws.open(uri, "binary") allowed to overcome the code 400 problem.

    3.2 in the definition of do_recv (this is a permalink), add the following line after the initial var statement: arr = Array.from(arr); this is a conversion to Array since Uint8Array didn't apparently support the shift method.

  4. open wstelnet.html with firefox, select Host: localhost, Port: 2023, no encryption, press Connect and type into the black field.

The screen should reply with echoServer received: <YOUR_MESSAGE>. hurray!

于 2017-03-15T16:59:29.960 回答