Websocket против объекта SockJS

Мне интересно, почему вы можете инициализировать обычный веб-сокет javascript с помощью:

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

Но с SockJS вам нужно вызвать обычный URL-адрес http (s):

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

Почему SockJS не разрешает «обычные» URL-адреса ws?


person David542    schedule 10.10.2018    source источник


Ответы (1)


Протокол веб-сокета, начинающийся с ws:, определен в RFC6455.

Хотя будущие реализации протокола могут получить выделенные номера портов для безопасного и незащищенного трафика, на данный момент (2018 г.) протокол инициируется путем отправки HTTP-запроса с заголовком обновления для изменения протокола на WS. (Ссылки 1, 2 и 3).

Для использования веб-сокетов и ws протоколов требуется клиентская поддержка API веб-сокетов. и поддержка сервером заголовка обновления протокола и связи через веб-сокет.

SockJS похож на полфилл для веб-сокетов, который будет использовать доступные каналы связи, если веб-сокеты недоступны. Согласно файлу readme.md,

«SockJS предназначен для работы во всех современных браузерах и в средах, не поддерживающих протокол WebSocket, например, за корпоративными прокси-серверами с ограничениями.

И веб-сокеты, и SockJS требуют поддержки на сервере. НАПРИМЕР. для узла либо ws, либо SockJS для узла. В файле readme.md для SockJS указано, что сервер будет принимать необработанные запросы с использованием заголовка протокола ws:, но не указывается, на каком порту.

Если запрос на стороне клиента не принимает URL-адреса ws, я предлагаю предположить, что он был написан на основе предположений о выполнении начального запроса HTTP/HTTPS для определения поддержки. Возможно, запрос на обновление может расширить протоколы, принимаемые в URL-адресе!

person traktor    schedule 10.10.2018