13

那里有很多 websocket -> 套接字包装器(例如websockify),但是那里有相反的东西吗?具体来说,我希望能够使用应用程序连接到 TCP 套接字,并将代理转换为 websocket 并转换到另一个 websocket 服务器。

4

4 回答 4

11

从 WebSocket 客户端到 TCP 服务器的桥接是一种通用的解决方案,将较低级别的 TCP 协议封装到较高级别的 WebSocket 协议中。它允许浏览器(或其他 websocket 客户端)与任意 TCP 服务器通信。请注意,客户端 (JavaScript) 应用程序必须仍然能够解码/编码 TCP 服务器使用的协议。

反向操作不是通用的,需要对从 TCP 客户端应用程序到桥接器的消息进行特殊框架,以便桥接器知道如何将 WebSocket 消息编码到 TCP 服务器。WebSockets 是基于消息的传输,而 TCP 是较低级别的流传输。TCP 传输层在协议本身中没有消息的概念,因此必须在高层处理。换句话说,您需要做的工作几乎与直接在您的应用程序中实现 WebSocket 客户端所需的工作量一样多。实际上,直接实现可能较少,因为已经有适用于大多数流行语言的 WebSocket 客户端库。

如果不更改客户端和网桥(以添加消息边界和操作码信息),您将无法通过网桥将预先存在的 TCP 客户端连接到现有的 WebSocket 服务器,或者您将需要一个忽略 WebSiocket 的特殊 WebSocket 服务器消息边界并将传入数据视为流(在更高层处理消息解析)。

也许您可以给出一个您认为这可能有用的用例?

免责声明:我制作了 websockify。

于 2013-02-18T16:39:12.853 回答
6

我不确定你在寻找什么,但如果将来对某人有帮助,我会写下我为解决我的问题所做的事情。

我的问题: 我希望能够在我的 Web 应用程序的服务器上托管 noVNC,并且我希望非 websocket vnc 服务器能够在不使用 websockify 的情况下理解它。

我的解决方案: 我使用ws-tcp-bridge node.js 模块来桥接 websocket 端口<--lport>,noVNC 客户端将在该端口与 vnc tcp 服务器的主机连接。

示例: 这通过从 vncserver 的机器上运行以下命令来实现:

ws-tcp-bridge --method=ws2tcp --lport=5555 --rhost=127.0.0.1:5902

这样我就能够在 port 托管一个非 websocket vncserver5902并通过 noVNC 在 port 与它连接5555

没有对此进行太多测试,但与x11vnc vnc 服务器配合得很好。

于 2015-12-16T16:43:38.173 回答
0

我不完全清楚你在问什么,但 WebSocket API 主要适用于客户端。

如何编写服务器端脚本以及使用什么语言完全取决于您。在编写服务器端脚本时,您应该能够选择是否使用 TCP 套接字等。

于 2013-02-18T08:45:20.703 回答
0

这是我编写的这种代理的基本实现: https ://github.com/jimparis/unwebsockify/

正如@kanaka 所描述的,从 TCP 到 Websockets 不是通用操作,但是如果您只是想将纯字节流发送到期望的服务器,这将起作用。

从自述文件:

Unwebsockify 是一个 TCP 到 WebSocket 代理/桥接器。它接受普通的 TCP 连接并连接到 WebSocket 服务器,有效地将 WS 支持添加到本机不支持它的客户端。它本质上与 websockify 正好相反。

还有一个有用的例子:

Eclipse Mosquitto 在服务器端支持 WebSocket,但在客户端不支持(用于桥接)。要通过 websocket 桥接两个 MQTT 实例,请在客户端上运行 unwebsockify:

venv/bin/python unwebsockify.py --port 13232 --subproto mqtt wss://server/

并使用例如配置和运行 MQTT 客户端实例

address 127.0.0.1:13232

于 2021-08-20T16:37:48.850 回答