WebSockets против событий, отправленных сервером / EventSource - PullRequest
723 голосов
/ 04 марта 2011

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

Ответы [ 7 ]

853 голосов
/ 16 марта 2011

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

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

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

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

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

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

Замечания:

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

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

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

Почему вы выбрали бы события, отправленные сервером, вместо WebSockets?Хороший вопрос.

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

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


Сводка TLDR:

Преимущества SSE по сравнению с веб-сокетами:

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

ПреимуществаВеб-сокеты по SSE:

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

Идеально подходит дляSSE:

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

SSE получил:

  • Нет бинарной поддержки
  • Максимально открытое соединениепредел s
98 голосов
/ 23 января 2014

По данным caniuse.com:

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

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

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

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

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

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

  • WebSockets поддерживает произвольные двоичные данные, SSE использует только UTF-8
15 голосов
/ 11 марта 2011

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

6 голосов
/ 01 мая 2017

Websocket VS SSE


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

Example - Online chat application.

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

Example - Online stock quotes or cricket score website.
3 голосов
/ 19 апреля 2014

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

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

I Предположим, проблем с отправляемыми сервером событиями не так много. Но я не знаю.

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

1 голос
/ 12 июля 2014

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

0 голосов
/ 22 ноября 2017

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...