Websocket 与 SockJS 对象

Websocket vs SockJS object

我想知道为什么你能够初始化一个正常的 javascript websocket:

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

但是使用 SockJS 你需要调用一个普通的 http(s) url:

var sock = new SockJS('https://example.com/my_prefix');

为什么 SockJS 不允许 'normal' ws urls?

ws:开头的websocket协议在RFC6455中定义。

虽然该协议的未来实施可能会获得用于安全和非安全流量的专用端口号,但目前(2018 年)该协议是通过发出带有升级 header 的 HTTP 请求来启动的,以将协议更改为WS。 (参考 1, 2 & 3)。

使用 websockets 和 ws 协议需要客户端支持 websockets API 和服务器支持协议升级 header 和 websocket 通信。

SockJS 就像 websockets 的 pollyfill,如果 websockets 不可用,它将 fall-back 到可用的通信渠道。根据 readme.md 文件,

"SockJS is intended to work for all modern browsers and in environments which don't support the WebSocket protocol -- for example, behind restrictive corporate proxies.

websockets 和 SockJS 都需要服务器支持。例如。对于节点,ws or SockJS for node。 SockJS 的 readme.md 文件声明服务器将使用 ws: 协议 header 接受原始请求,但没有提及在哪个端口上。

如果客户端请求不接受 ws URL,我建议假设它是围绕发出初始 HTTP/HTTPS 请求以确定支持的假设编写的。也许更新请求可能会扩展 URL!

中接受的协议