我想知道为什么你能够使用以下代码初始化一个普通的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?
我想知道为什么你能够使用以下代码初始化一个普通的JavaScript WebSocket:
var socket = new WebSocket('ws://example.com/myprefix')
var sock = new SockJS('https://example.com/my_prefix');
WebSocket协议以ws:
开头,定义在RFC6455中。
尽管未来协议的实现可能会为安全和非安全流量分配专用端口号,但目前(2018年),通过使用带有升级标头的HTTP请求来初始化协议以将其更改为WS。(参考文献1,2和3)。
使用WebSockets和ws
协议需要客户端支持websockets API,并且服务器支持协议升级标头和WebSocket通信。
SockJS类似于WebSocket的polyfill,如果WebSocket不可用,则会回退到可用的通信通道。 根据readme.md文件所述:
"SockJS旨在适用于所有现代浏览器和不支持WebSocket协议的环境 - 例如,在受限制的公司代理后面。
WebSocket 和 SockJS 都需要服务器端支持。例如,对于 Node.js,可以选择使用 ws 或 SockJS for node。
SockJS 的 readme.md 文件说明服务器将接受使用 ws:
协议头的原始请求,但没有指明使用哪个端口。
如果客户端请求不接受 ws
URL,请考虑假设它是基于最初的 HTTP/HTTPS 请求来确定支持的假设。也许更新请求可能会扩展 URL 中接受的协议!
sockjs-client
保持不变。 - traktor