浏览器上的 WebSocket 客户端可以与 TCP Socket 服务器通信吗?

Posted

技术标签:

【中文标题】浏览器上的 WebSocket 客户端可以与 TCP Socket 服务器通信吗?【英文标题】:Possible for WebSocket client on browser to talk to TCP Socket server? 【发布时间】:2013-03-01 15:03:13 【问题描述】:

是否可以运行一个 TCP Socket 服务器来接受来自 WebSocket 客户端的传入连接?我有一个 TCP 套接字服务器,我希望能够在浏览器中测试它。这可能吗?

【问题讨论】:

【参考方案1】:

绝对!这就是websockify的目的。

当然,您的 WebSocket 客户端应用程序需要能够实现 TCP 服务器的协议。例如,noVNC 是一个浏览器 VNC 客户端,它实现了 RFB 协议,通过使用 websockify 可以连接到一个普通的基于 TCP 的 VNC 服务器。

免责声明:我创建了websockify 和noVNC

【讨论】:

@jaffa,是的,这是主要用例。 但这就像代理?就像artemyankov.com/tcp-client-for-browsers? @HackNone 从技术上讲是一个“桥”(每一端有不同的协议),但是它类似于 WebTCP(链接在那篇文章中)。只是一些不同之处:WebTCP 既年轻又在过去一年没有更新。 WebTCP 在 JS/node 中实现,websockify 有多种语言的实现(包括 JS)。 websockify 是较低级别的(原始 websock 数据,没有 JSON 消息包装器)。 WebTCP 有一个巨大的安全问题,因为它允许浏览器连接到任意远程目的地;请参阅github.com/kanaka/websockify/issues/3 websockify 有大型部署(例如 OpenStack)。 所以你是说我可以通过 WebSockets 与使用 TCP 的程序对话?这是否意味着我的服务器甚至不需要 WebSockets(只是我的浏览器)? @Cameron 你的服务器要么需要支持 WebSockets,要么你需要使用 websockify 之类的东西来桥接 WebSockets 和 TCP。【参考方案2】:

TCP 和 WebSocket 不是相同的协议或框架,因此盲目地连接它们是行不通的。嗯......从技术上讲,websocket 是 http 的升级,它在 ssl 上分层(可选),而后者又在 tcp 上分层。

TCP可以看成是一个字节流,而WebSocket是一组帧。

WebSocket 帧可以是以下任何一种:

TEXT - 由 1 个或多个帧组成一条 UTF8 消息 BINARY - 由 1 个或多个构成字节数组消息的帧组成 CONTINUATION - 由 TEXT 和 BINARY 用于拼凑 2 个或更多帧。 PING - 明显 PONG - 明显 CLOSE - 请求关闭/断开协议。

简而言之,您需要实现websocket protocol framing 才能将TCP 连接到websocket。您需要实现基本的HTTP UPGRADE 才能达到这一点。

【讨论】:

总之,不可能吗? 这是可能的,但需要做很多额外的工作。可以说,它不会“开箱即用”。 澄清一下,这不是流与帧,而是流与消息。 TCP 协议携带一个字节流,应用程序必须将这些字节流重新组合成原始消息。 WebSocket 协议携带消息,因此发送的每条消息都作为单个完整消息接收。术语“框架”是一个适用于 TCP 和 WebSockets(实际上是任何有线协议)的概念。

以上是关于浏览器上的 WebSocket 客户端可以与 TCP Socket 服务器通信吗?的主要内容,如果未能解决你的问题,请参考以下文章

带有代理的 WSS 使用端口 443 浏览器客户端连接到端口 6001 上的 websocket 服务器

由于 BoringSSL 证书验证失败,iOS 上的安全 websocket 连接失败

(chap9 基于HTTP的功能追加协议) WebSocket使用浏览器进行全双工通信

WebSocket和HTTP的区别与联系

12 WebSocket

WebSocket