在客户端 javascript 创建 TCP/IP 套接字

Create TCP/IP socket in client-side javascript

我有一个 java 客户端,我需要在(客户端)java脚本中重写它。 我这样打开 java 套接字:

Socket socket = new Socket("127.0.0.1", 5015);

所以我尝试在java脚本中使用websocket: 让 socket = new WebSocket("http://127.0.0.1:5015");

但是这里我有一个js错误:

Uncaught DOMException: Failed to construct 'WebSocket':

URL 的方案必须是 'ws' 或 'wss'。 'http' 不允许。

我也尝试过使用 'ws' 或 'wss' 协议,但服务器不想与此类协议握手。

有没有办法在客户端java脚本中建立这样的套接字连接,或者它绝对被禁止?

开握手是为了兼容基于HTTP的 服务器端软件和中介,以便单个端口可以 由与该服务器和 WebSocket 通信的 HTTP 客户端使用 客户与该服务器交谈。为此,WebSocket 客户端的 握手是一个 HTTP 升级请求:

    GET /chat HTTP/1.1
    Host: server.example.com
    Upgrade: websocket
    Connection: Upgrade
    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
    Origin: http://example.com
    Sec-WebSocket-Protocol: chat, superchat
    Sec-WebSocket-Version: 13

https://www.rfc-editor.org/rfc/rfc6455

WebSockets 服务器必须能够处理 HTTP 请求!

不,您不能在任何浏览器中从网页建立任意 TCP 连接。

Web 套接字从根本上不同于 TCP 套接字...它们本质上是不相关的。它们是 HTTP 和客户端 API 之上的薄层,允许 Web Socket 客户端和支持 Web Socket 的服务器之间的双向通信。

您可以使用代理服务器 运行 允许通过它们进行连接以建立 TCP 连接,但这当然是服务器功能,您不能单独在浏览器中执行此操作。

答案比“不,你做不到”要复杂一些。

Javascript 在常规网页中 运行 在网络浏览器中无法打开普通套接字。根本原因是它对用户来说是一种安全风险。所以故意不允许。

WebSockets 是执行此操作的安全方法。结合其他浏览器安全机制,它们限制了允许网页连接的内容。

然而,这并不是故事的结局。 trusted 代码可以(至少在理论上)发送和接收 TCP 和 UDP 流量。问题在于执行此操作的 API 是非标准的(例如,特定于浏览器)。在某些情况下,它们本身被实现为第 3 方浏览器扩展。

因此,如果您真的想为您的应用程序追求这一点,您将不得不将您的代码作为受信任的浏览器插件/扩展程序进行分发,并处理一系列浏览器可移植性问题。

值得注意的是 一个 W3C 工作组试图标准化原始套接字 API,但他们已经正式放弃了他们的努力。他们的最新工作草案可在以下位置找到:

最后还有一个问题,一个受信任的浏览器扩展/插件需要用户同意才能安装。考虑到与将此类功能嵌入用户浏览器相关的深层和微妙的安全问题,获得对此类内容的知情同意很困难。