在客户端javascript

时间:2018-09-01 06:04:59

标签: javascript sockets client-side tcp-ip

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

  

Socket socket = new Socket(“ 127.0.0.1”,5015);

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

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

  

未捕获的DOMException:无法构造'WebSocket':

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

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

是否可以在客户端javascript中建立此类套接字连接,或者绝对禁止这种方法?

3 个答案:

答案 0 :(得分:2)

否,您无法在任何浏览器中通过网页建立任意的TCP连接。

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

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

答案 1 :(得分:1)

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

在 Web 浏览器中运行的常规网页中的 JavaScript 无法打开普通套接字。根本原因是它对用户构成了安全风险。所以是故意不允许的。

WebSockets 是实现此目的的安全方式。与其他浏览器安全机制结合使用,它们会限制允许网页连接的内容。

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

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

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

最后还有一个问题,一个受信任的浏览器扩展/插件需要用户同意才能安装。鉴于在用户浏览器中嵌入此类功能会带来深刻而微妙的安全问题,因此很难获得知情同意。

答案 2 :(得分:0)

开放式握手旨在与基于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://tools.ietf.org/html/rfc6455

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