Websocket 与 SockJS 对象

Dav*_*542 4 javascript websocket sockjs

我想知道为什么您可以使用以下命令初始化普通的 javascript websocket:

 var socket = new WebSocket('ws://example.com/myprefix')
Run Code Online (Sandbox Code Playgroud)

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

var sock = new SockJS('https://example.com/my_prefix');
Run Code Online (Sandbox Code Playgroud)

为什么 SockJS 不允许“正常”的 ws url?

tra*_*r53 12

websocket 协议,开始ws:RFC6455 中定义。

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

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

SockJS就像 websockets 的一个 pollyfill,如果 websockets 不可用,它会回退到可用的通信通道。根据 readme.md 文件,

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

websockets 和 SockJS 都需要服务器支持。EG 代表节点,wsSockJS 代表节点。SockJS 的 readme.md 文件声明服务器将使用ws:协议标头接受原始请求,但没有提及哪个端口。

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