WebSockets против событий, отправленных сервером / EventSource

611

Оба WebSockets и Server-Sent Events могут передавать данные в браузеры. Для меня они, похоже, являются конкурирующими технологиями. В чем разница между ними? Когда вы выберете один за другим?

  • 2
    Не уверен, как вы видите их как конкурирующих. Один из них является синхронным и может / может использоваться для почти полного в реальном времени обмена данными, тогда как другой является асинхронным и будет использоваться для совершенно другой цели (эффективно отправляя тост-подобные сообщения из приложения на стороне сервера).
  • 39
    WebSockets имеет две стороны, он может отправлять данные на сервер.
Показать ещё 3 комментария
Теги:
websocket
server-sent-events

7 ответов

625
Лучший ответ

Websockets и SSE (события, отправленные сервером) могут одновременно передавать данные в браузеры, однако они не конкурируют с технологиями.

Соединения веб-соединений могут как отправлять данные в браузер, так и получать данные из браузера. Хорошим примером приложения, которое может использовать websockets, является приложение чата.

Соединения SSE могут только передавать данные в браузер. Онлайн-котировки акций или твиттеры, обновляющие временную шкалу или фид, являются хорошими примерами приложения, которое может извлечь выгоду из SSE.

На практике, поскольку все, что можно сделать с помощью SSE, также можно выполнять с помощью Websockets, Websockets получает гораздо больше внимания и любви, а многие другие браузеры поддерживают веб-узлы, чем SSE.

Однако это может быть чрезмерным для некоторых типов приложений, а бэкэнд может быть проще реализовать с помощью протокола, такого как SSE.

Кроме того, SSE можно полилизовать в более старые браузеры, которые не поддерживают его изначально, используя только JavaScript. Некоторые реализации SSF-полиполков можно найти на странице страница Modernizr github.

Gotchas:

  • SSE имеет ограничение на максимальное количество открытых подключений, что может быть особенно болезненно при открытии различных вкладок, поскольку предел для каждого браузера и установлен на очень низкое число (6). Проблема отмечена как "Не исправлена" в Chrome и Firefox
  • Только WS может передавать как двоичные данные, так и UTF-8, SSE ограничивается UTF-8. (Спасибо Chado Nihi).

HTML5Rocks содержит некоторую полезную информацию об SSE. С этой страницы:

События, отправленные сервером, и веб-узлы

Почему вы выбираете Server-Sent Events через WebSockets? Хороший вопрос.

Одна из причин, по которой SSE хранится в тени, заключается в том, что более поздние API, такие как WebSockets, обеспечивают более богатый протокол для выполнения двунаправленной полнодуплексной связи. Наличие двухканального канала более привлекательно для таких вещей, как игры, приложения для обмена сообщениями и для случаев, когда вам нужны почти обновления в реальном времени в обоих направлениях. Однако в некоторых сценариях данные не нужно отправлять с клиента. Вам просто нужны обновления из какого-либо действия сервера. Несколько примеров - это обновления статуса друзей, биржевые тикеры, новостные ленты или другие автоматизированные механизмы передачи данных (например, обновление клиентской базы данных веб-SQL или хранилища объектов IndexedDB). Если вам нужно отправить данные на сервер, XMLHttpRequest всегда является другом.

SSE отправляются по традиционному HTTP. Это означает, что для работы не требуется специальный протокол или реализация сервера. WebSockets, с другой стороны, требуют полнодуплексных соединений и новых серверов Socket Socket для обработки протокола. Кроме того, Server-Sent Events имеют множество функций, которые не имеют WebSockets, такие как автоматическое повторное подключение, идентификаторы событий и возможность отправки произвольных событий.


Краткий обзор TL;DR:

Преимущества SSE над Websockets:

  • Передается через простой HTTP вместо настраиваемого протокола
  • Может быть заполнен с помощью javascript для "backport" SSE для браузеров, которые еще не поддерживают его.
  • Встроенная поддержка повторного подключения и идентификатора события
  • Простой протокол

Преимущества веб-узлов над SSE:

  • Реальное время, двухсторонняя связь.
  • Встроенная поддержка в более браузерах

Идеальные варианты использования SSE:

  • Поток потокового тикета
  • Обновление твиттера
  • Уведомления в браузере

SSE gotchas:

  • Нет двоичной поддержки
  • Максимальное ограничение открытых подключений
  • 108
    Общение с SSE вполне возможно - вы можете использовать обычный POST для отправки сообщений на сервер. WebSockets понадобятся только в том случае, если вы внедряете чат в Google Wave.
  • 93
    Это правда, что чат и другие приложения в реальном времени могут быть сделаны с SSE. Однако это требует ответов POSTing «вне диапазона», т. Е. Это не контролируется протоколом SSE и не кажется хорошим примером для базового объяснения различий между SSE и Websockets. Вы можете реализовать чат с базовым HTTP-опросом сервера каждую секунду и отправкой новых ответов. Это не значит, что это лучший / самый элегантный способ сделать это.
Показать ещё 12 комментариев
88

Согласно caniuse.com:

Вы можете использовать клиентский polyfill для расширения поддержки SSE во многих других браузерах. Это менее вероятно с помощью WebSockets. Некоторые полисы заполнения EventSource:

  • EventSource Remy Sharp без каких-либо других зависимостей библиотек (IE7 +)
  • jQuery.EventSource Рик Уолдрон
  • EventSource Yaffle (заменяет собственную реализацию, нормализуя поведение браузеров )

Если вам нужно поддерживать все браузеры, подумайте об использовании библиотеки, например web-socket-js, SignalR или socket.io, которые поддерживают несколько транспортов, таких как WebSockets, SSE, Forever Frame и AJAX long опрос. Они часто также требуют изменений на стороне сервера.

Узнайте больше о SSE:

Узнайте больше о WebSockets:

Другие отличия:

  • WebSockets поддерживает произвольные двоичные данные, SSE использует только UTF-8
  • 2
    Я хотел бы отметить, что в 2016 году> 95% глобальных пользователей изначально поддерживают WebSockets. Все браузеры и устройства поддерживают WebSockets более 4 лет. Socket.IO откатится на долгий опрос AJAX и обработает сложности эмуляции WebSockets для вас, если он не поддерживается, что делает поддержку 100%. Если вы используете что-то кроме WebSockets в 2016 году, вы используете устаревшую технологию.
13

Opera, Chrome, Safari поддерживает SSE, Chrome, Safari поддерживает SSE внутри SharedWorker Firefox поддерживает XMLHttpRequest readyState в интерактивном режиме, поэтому мы можем сделать polyfil EventSource для Firefox

4

Websocket VS SSE


Веб-сокеты -. Это протокол, обеспечивающий полнодуплексный канал связи по одному TCP-соединению.   Например, двусторонняя связь между Сервером и Браузером Поскольку протокол более сложный, сервер и браузер должны полагаться на библиотеку websocket который socket.io

Example - Online chat application.

SSE (событие, отправленное сервером) - В случае серверного события связь выполняется только с сервера на браузер, и браузер не может отправлять какие-либо данные на сервер. Такое общение в основном используется когда необходимо показывать только обновленные данные, сервер отправляет сообщение всякий раз, когда данные обновляются.   Например, односторонняя связь между сервером и браузером. Этот протокол менее сложный, поэтому нет необходимости полагаться на внешнюю библиотеку. Сам JAVASCRIPT предоставляет интерфейс EventSource для приема отправленных сервером сообщений.

Example - Online stock quotes or cricket score website.
3

Одно замечание:
У меня были проблемы с веб-сайтами и корпоративными брандмауэрами. (Использование HTTPS помогает, но не всегда.)

См. https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94

Я предполагаю, что проблем с Server-Sent Events не так много. Но я не знаю.

Тем не менее, WebSockets - это очень весело. У меня есть небольшая веб-игра, в которой используются websockets (через Socket.IO) (http://minibman.com)

1

Here - это разговоры о различиях между веб-сокетами и событиями, отправленными сервером. Поскольку Java EE 7 API WebSocket уже является частью спецификации, и кажется, что отправленные сервером события будут выпущены в следующая версия версии предприятия.

-2

Максимальное ограничение соединения не является проблемой с http2 + sse.

Это была проблема на http 1

  • 0
    Http2 позволяет обрабатывать несколько запросов в одном домене как потоки. Эта техника называется мультиплексированием. Это сохраняет ограничения подключения браузера для домена, что является причиной, по которой люди используют разделение домена с помощью Http1.
  • 0
    Количество потоков HTTP / 2 также ограничено, это защищает серверы от бомбардировки одним браузером и вынуждает браузеры ограничивать их мультиплексирование ограниченным числом потоков, что в нашем случае совпадает с соединениями HTTP / 1.1. ... который возвращает вас к пределу соединения SSE.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню