【问题标题】:Create TCP/IP socket in client-side javascript在客户端 javascript 中创建 TCP/IP 套接字
【发布时间】:2019-02-07 01:42:03
【问题描述】:

我有一个 java 客户端,我需要用(客户端)javascript 重写它。 我像这样打开java Socket:

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

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

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

未捕获的 DOMException:无法构造“WebSocket”:

URL 的方案必须是“ws”或“wss”。不允许使用“http”。

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

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

【问题讨论】:

    标签: javascript sockets client-side tcp-ip


    【解决方案1】:

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

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

    WebSockets 是执行此操作的安全方式。与其他浏览器安全机制结合使用时,它们会限制允许连接的网页。

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      Web 套接字与 TCP 套接字根本不同……它们本质上是不相关的。它们是 HTTP 之上的一个薄层,还有一个客户端 API,允许 Web Socket 客户端和支持 Web Sockets 的服务器之间进行双向通信。

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

      【讨论】:

        【解决方案3】:

        打开握手旨在与基于 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 请求!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-29
          • 2013-10-24
          • 2020-05-14
          • 2022-08-05
          • 1970-01-01
          • 2015-06-24
          • 1970-01-01
          相关资源
          最近更新 更多