TCP 套接字到 Websocket?

Posted

技术标签:

【中文标题】TCP 套接字到 Websocket?【英文标题】:TCP Socket to Websocket? 【发布时间】:2013-02-18 01:29:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

免责声明:我制作了 websockify。

【讨论】:

好吧,例如,您的 websockify 用于 VNC 服务器上以利用 noVNC。我实际上需要将本机客户端附加到该 VNC 服务器,但只有 websockified 部分暴露在互联网上。所以看起来我实际上可能会为我完成工作...... 将此标记为答案,因为它当时最适用。谢谢你的帮助,卡纳卡。 @kanaka ,你不是已经必须在 websockify 中实现非边界数据流了吗?从 TCP 服务器返回到浏览器客户端的数据本质上是一个数据流。 我希望 websockify 能够做到这一点,但看到它做不到,我感到很失望。然后我找到了这个线程。在您的最后一段中,您提到了将我们带到这里的明显用例——我们不关心 websocket 特定的消息边界。也就是说,你的评价是错误的。在只需要原始通信流的情况下,拥有这样一个反向代理非常有意义。 @Hyena 我有兴趣了解有关您的用例的更多信息。如果我理解,您有一台只能说 WebSockets 但将有效负载视为普通 TCP 的服务器,这样如果只有数据被 WebSockets 包装(并且在碎片的情况下可以容忍任意边界),常规 TCP 客户端就可以连接到它?这是一个非常奇怪的用例,我有兴趣了解更多关于它的信息(既因为我对此非常好奇,也可能如果我理解“为什么”我可以提出解决方案)。【参考方案2】:

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

我的问题: 我希望能够在我的 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 服务器配合得很好。

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

这是我编写的这种代理的基本实现: 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

【讨论】:

您可能希望表明您拥有或管理该项目。 当然,如果这很重要的话.. 已添加

以上是关于TCP 套接字到 Websocket?的主要内容,如果未能解决你的问题,请参考以下文章

Flash 中的 WebSocket 与原始 TCP 套接字

如何在NodeJS中代理websocket连接到其他websockets

SuperWebSocket

接受 websocket 使用 tcp .net 很慢?

python---websocket的使用

Nginx代理WebSocket方法