【发布时间】:2013-02-18 01:29:04
【问题描述】:
那里有很多 websocket -> 套接字包装器(例如websockify),但是那里有相反的可用吗?具体来说,我希望能够使用应用程序连接到 TCP 套接字,并将代理转换为 websocket 并转换为另一个 websocket 服务器。
【问题讨论】:
标签: websocket
那里有很多 websocket -> 套接字包装器(例如websockify),但是那里有相反的可用吗?具体来说,我希望能够使用应用程序连接到 TCP 套接字,并将代理转换为 websocket 并转换为另一个 websocket 服务器。
【问题讨论】:
标签: websocket
WebSocket客户端到TCP服务器的桥接是一种通用的解决方案,将低层的TCP协议封装到高层的WebSocket协议中。它允许浏览器(或其他 websocket 客户端)与任意 TCP 服务器通信。请注意,客户端 (JavaScript) 应用程序必须仍然能够解码/编码 TCP 服务器使用的协议。
反向操作不是通用的,需要对从 TCP 客户端应用程序到桥接器的消息进行特殊框架,以便桥接器知道如何将 WebSocket 消息编码到 TCP 服务器。 WebSockets 是基于消息的传输,而 TCP 是较低级别的流传输。 TCP 传输层在协议本身中没有消息的概念,因此必须在高层处理。换句话说,您需要做的工作几乎与直接在您的应用程序中实现 WebSocket 客户端所需的工作量一样多。实际上,直接实现可能比较少,因为已经有适用于大多数流行语言的 WebSocket 客户端库。
如果不更改客户端和网桥(以添加消息边界和操作码信息),您将无法通过网桥将预先存在的 TCP 客户端连接到现有的 WebSocket 服务器,或者您将需要一个特殊的 WebSocket 服务器忽略 WebSiocket 消息边界并将传入数据视为流(在更高层处理消息解析)。
也许您可以给出一个您认为这可能有用的用例?
免责声明:我制作了 websockify。
【讨论】:
我不确定你在寻找什么,但如果将来对某人有帮助,我会写下我为解决我的问题所做的事情。
我的问题: 我希望能够在我的 Web 应用程序的服务器上托管 noVNC,并且我希望非 websocket vnc 服务器能够在不使用 websockify 的情况下理解它。
我的解决方案: 我使用ws-tcp-bridge node.js 模块来桥接 websocket 端口,noVNC 客户端将连接到该端口与 vnc tcp 服务器的主机。
示例: 这通过在 vncserver 的机器上运行以下命令来实现:
ws-tcp-bridge --method=ws2tcp --lport=5555 --rhost=127.0.0.1:5902
这样我就能够在端口5902 上托管一个非websocket vncserver,并通过端口5555 上的noVNC 与其连接。
没有对此进行太多测试,但与x11vnc vnc 服务器配合得很好。
【讨论】:
我不完全清楚你在问什么,但 WebSocket API 主要适用于客户端。
如何编写服务器端脚本以及使用什么语言完全取决于您。在编写服务器端脚本时,您应该能够选择是否使用 TCP 套接字等。
【讨论】:
这是我编写的这种代理的基本实现: 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
【讨论】: