Websockets и SSE (Server Sent Events) способны передавать данные в браузеры, однако они не являются конкурирующими технологиями.
Соединения через веб-сокеты могут отправлять данные в браузер и получать данные из браузера. Хорошим примером приложения, которое может использовать websockets, является приложение чата.
SSE-соединения могут передавать данные только в браузер. Онлайн котировки акций или твиттеры, обновляющие сроки или фид, являются хорошими примерами приложения, которое может извлечь выгоду из SSE.
На практике, поскольку все, что можно сделать с помощью SSE, можно также сделать с помощью Websockets, Websockets привлекает гораздо больше внимания и любви, и многие другие браузеры поддерживают Websockets, чем SSE.
Тем не менее, это может быть излишним для некоторых типов приложений, и бэкэнд может быть проще реализовать с помощью протокола, такого как SSE.
Кроме того, SSE можно использовать в старых браузерах, которые изначально не поддерживают его, используя только JavaScript. Некоторые реализации полизаполнений SSE можно найти на странице gizub Modernizr .
Gotchas:
- SSE страдает от ограничения максимального количества открытых соединений, что может быть особенно болезненным при открытии различных вкладок, поскольку ограничение для каждого браузера установлено на очень низкое число (6). Эта проблема была помечена как «Не будет устранена» в Chrome и Firefox . Это ограничение на браузер + домен, так что это означает, что вы можете открыть 6 подключений SSE на всех вкладках
www.example1.com
и еще 6 подключений SSE www.example2.com
(спасибо Phate).
- Только WS может передавать как двоичные данные, так и UTF-8, SSE ограничен UTF-8. (Спасибо Чадо Нихи).
- Некоторые корпоративные брандмауэры с проверкой пакетов испытывают трудности при работе с WebSockets (Sophos XG Firewall, WatchGuard, McAfee Web Gateway).
HTML5Rocks имеет хорошую информацию о SSE. С этой страницы:
Отправленные сервером события против WebSockets
Почему вы выбрали бы Отправленные сервером события вместо WebSockets? Хороший вопрос.
Одна из причин, по которой SSE остаются в тени, заключается в том, что более поздние API, такие как WebSockets, предоставляют более богатый протокол для двунаправленной полнодуплексной связи. Наличие двустороннего канала более привлекательно для таких вещей, как игры, приложения для обмена сообщениями, а также для случаев, когда вам нужны обновления в реальном времени в обоих направлениях. Однако в некоторых случаях данные не нужно отправлять с клиента. Вам просто нужны обновления от некоторых действий сервера. Примерами могут служить обновления статуса друзей, биржевые сводки, новостные ленты или другие автоматизированные механизмы передачи данных (например, обновление клиентской базы данных Web SQL или хранилища объектов IndexedDB). Если вам нужно отправить данные на сервер, XMLHttpRequest всегда будет вашим другом.
SSE передаются по традиционному HTTP. Это означает, что они не требуют специального протокола или серверной реализации для работы. WebSockets, с другой стороны, требуют полнодуплексных соединений и новых серверов Web Socket для обработки протокола. Кроме того, события, отправляемые сервером, имеют множество функций, которые отсутствуют в WebSockets, такие как автоматическое переподключение, идентификаторы событий и возможность отправлять произвольные события.
Резюме TLDR:
Преимущества SSE перед Websockets:
- Транспортируется по простому HTTP вместо пользовательского протокола
- Может быть заполнен javascript для «обратного переноса» SSE в браузеры, которые его еще не поддерживают.
- Встроенная поддержка для повторного подключения и идентификатор события
- Более простой протокол
- Нет проблем с корпоративными брандмауэрами, выполняющими проверку пакетов
Преимущества веб-сокетов перед SSE:
- В режиме реального времени два направления общения.
- Встроенная поддержка в нескольких браузерах
Идеальные варианты использования SSE:
- Поток тикера
- обновление твиттера
- Уведомления в браузер
SSE получил:
- Нет бинарной поддержки
- Максимальный предел открытых соединений