Websocket和SockJS对象的区别

7

我想知道为什么你能够使用以下代码初始化一个普通的JavaScript WebSocket:

 var socket = new WebSocket('ws://example.com/myprefix')

但是使用SockJS时,您需要调用一个普通的http(s) URL:
var sock = new SockJS('https://example.com/my_prefix');

为什么SockJS不允许使用“正常”的WebSocket URL?
1个回答

18

WebSocket协议以ws:开头,定义在RFC6455中。

尽管未来协议的实现可能会为安全和非安全流量分配专用端口号,但目前(2018年),通过使用带有升级标头的HTTP请求来初始化协议以将其更改为WS。(参考文献123)。

使用WebSockets和ws协议需要客户端支持websockets API,并且服务器支持协议升级标头和WebSocket通信。

SockJS类似于WebSocket的polyfill,如果WebSocket不可用,则会回退到可用的通信通道。 根据readme.md文件所述:

"SockJS旨在适用于所有现代浏览器和不支持WebSocket协议的环境 - 例如,在受限制的公司代理后面。

WebSocket 和 SockJS 都需要服务器端支持。例如,对于 Node.js,可以选择使用 wsSockJS for node

SockJS 的 readme.md 文件说明服务器将接受使用 ws: 协议头的原始请求,但没有指明使用哪个端口。

如果客户端请求不接受 ws URL,请考虑假设它是基于最初的 HTTP/HTTPS 请求来确定支持的假设。也许更新请求可能会扩展 URL 中接受的协议!


截至2022年,我在使用sockjs-client 1.6.1时遇到了错误:“URL的方案必须是'http:'或'https:'。不允许使用'ws:'。” - Qiulang
@Qiulang 是的,在v1.6.1中,要求仍然是硬编码的socketjs-client.js:676。在我看来,Websockets Living Standard的2.1 Connections2.2 Opening Handshake,以及GitHub上Getting Started的第一行提供了合理的支持,可以让sockjs-client保持不变。 - traktor
感谢您的回复。我只是很难理解为什么在2022年我们仍然需要SockJS,因为WebSocket支持已经普及了,如果我们真的需要一个备用方案,为什么不使用socket.io呢? - Qiulang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接