我有一个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中建立此类套接字连接,或者绝对禁止这种方法?
答案 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请求!