有很多websocket->socket包装器(比如websocketify),但有相反的包装器吗?具体来说,我希望能够通过应用程序连接到TCP套接字,并将代理转换到websocket,然后再转换到另一个websocket服务器。
从WebSocket客户端到TCP服务器的桥接是一种通用的解决方案,它将较低级别的TCP协议封装到较高级别的WebSocket协议中。它允许浏览器(或其他websocket客户端)与任意TCP服务器进行通信。请注意,客户端(JavaScript)应用程序必须仍然能够解码/编码TCP服务器所使用的协议。
反向操作不是通用的,需要对从TCP客户端应用程序到网桥的消息进行特殊的成帧,以便网桥知道如何将WebSocket消息编码到TCP服务器。WebSockets是一种基于消息的传输,而TCP是一种较低级别的流传输。TCP传输层在协议本身中没有消息的概念,因此必须在高层处理。换句话说,要使TCP客户端应用程序能够和桥接应用程序进行通信,您需要做的工作几乎和直接在应用程序中实现WebSocket客户端所做的工作一样多。实际上,它可能不太容易直接实现,因为已经有适用于大多数流行语言的WebSocket客户端库。
在不更改客户端和网桥(添加消息边界和操作码信息)的情况下,您将无法通过网桥将预先存在的TCP客户端连接到现有的WebSocket服务器,或者您将需要一个特殊的WebSocket服务器,该服务器忽略WebSioket消息边界,并将传入数据视为流(在更高层处理消息解析)。
也许你可以给出一个你认为这可能有用的用例?
免责声明:我制作了webstockify。
我不确定你在寻找什么,但如果这对将来的人有帮助,我会写下我所做的来解决我的问题。
我的问题:我希望能够在我的web应用程序的服务器上托管noVNC,我希望非websocket vnc服务器能够在不使用websocketify的情况下理解它。
我的解决方案:我使用ws-tcp桥接node.js模块桥接websocket端口<--lport>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的客户端添加了WS支持。它本质上与WebSocket相反。
还有一个有用的例子:
Eclipse Mosquitto在服务器端支持WebSockets,但在客户端不支持(用于桥接)。要通过websocket桥接两个MQTT实例,请在客户端上运行unwebsockify:
venv/bin/python unwebsockify.py --port 13232 --subproto mqtt wss://server/
并使用例如配置和运行MQTT客户端实例
address 127.0.0.1:13232