Веб-сокетов и сервер-отправлено событий/тип EventSource
и WebSockets и Сервер-Отправлено Событий способны передавать данные в браузерах. Мне кажется, что это конкурирующие технологии. В чем разница между ними? Когда бы вы предпочли одно другому?
8 ответов:
Websockets и SSE (Server Sent Events) способны передавать данные в браузеры, однако они не являются конкурирующими технологиями.
соединения Websockets могут как отправлять данные в браузер, так и получать данные из браузера. Хорошим примером приложения, которое может использовать websockets, является приложение чата.
соединения SSE могут только передавать данные в браузер. Онлайн-котировки акций или твиттеры, обновляющие временную шкалу или канал, являются хорошими примерами приложения это может принести пользу SSE.
на практике, поскольку все, что можно сделать с помощью SSE, также можно сделать с помощью Websockets, Websockets получает гораздо больше внимания и любви, и многие другие браузеры поддерживают Websockets, чем SSE.
однако это может быть излишним для некоторых типов приложений, и бэкэнд может быть проще реализовать с помощью протокола, такого как SSE.
кроме того, SSE может быть заполнен в более старые браузеры, которые не поддерживают его изначально используя только JavaScript. Некоторые реализации SSE polyfills можно найти на Modernizr github страница.
Gotchas:
- SSE страдает от ограничения максимального количества открытых соединений, которое может быть особенно болезненным при открытии различных вкладок, поскольку предел в браузере и установите очень низкое число (6). Проблема была отмечена как "не исправит" в Chrome и Firefox
- только WS может передавать как двоичные данные, так и UTF-8, SSE ограничен UTF-8. (Спасибо чадо НИХИ).
HTML5Rocks имеет некоторую хорошую информацию о SSE. С этой страницы:
сервер-отправлено событий и веб-сокетов
Почему вы выбрали сервер-отправленные события через WebSockets? Лучший вопрос.
одна из причин, по которой SSEs были сохранены в тени, заключается в том, что более поздние API как WebSockets обеспечивают более богатый протокол для выполнения двунаправленной, полнодуплексной связи. Наличие двухстороннего канала более привлекательно для таких вещей, как игры, приложения для обмена сообщениями, а также для случаев, когда вам нужны обновления в режиме реального времени в обоих направлениях. Однако в некоторых случаях данные не нужно отправлять от клиента. Вам просто нужны обновления от некоторых действий сервера. Несколько примеров-это обновления статуса друзей, биржевые тикеры, новостные ленты или другие автоматические механизмы передачи данных (например обновление клиентской базы данных Web SQL или хранилища объектов IndexedDB). Если вам нужно отправить данные на сервер, XMLHttpRequest всегда является другом.
SSEs передаются по традиционному HTTP. Это означает, что они не требуют специального протокола или сервера, чтобы получить работу. WebSockets, с другой стороны, требуют полнодуплексных соединений и новых серверов веб-сокетов для обработки протокола. Кроме того, события, отправленные сервером, имеют множество функций, которых не хватает WebSockets по дизайну например, автоматическое переподключение, идентификаторы событий и возможность отправки произвольных событий.
прям как резюме:
преимущества SSE над Websockets:
- транспортируется по простому HTTP вместо пользовательского протокола
- может быть Поли-заполнен javascript для "backport" SSE для браузеров, которые еще не поддерживают его.
- встроенная поддержка повторного подключения и event-id
- проще протокол
преимущества Websockets над SSE:
- в режиме реального времени, два направления связи.
- встроенная поддержка в браузерах
идеальные варианты использования SSE:
- биржевой тикер потоковое
- обновление Твиттера
- уведомления в браузер
SSE проблемы:
- нет поддержки бинарных
- максимальный предел открытых соединений
согласно caniuse.com:
- %90 пользователей изначально поддержка WebSockets
- %84 пользователей изначально поддерживает сервер-отправленные события
вы можете использовать только клиентский polyfill для расширения поддержки SSE для многих других браузеров. Это менее вероятно, с WebSockets. Некоторые источники событий polyfills:
- EventSource Реми Шарп без каких-либо других зависимостей библиотеки (IE7+)
- jQuery.Источник события Рик Уолдрон
- EventSource by Yaffle (заменяет нативную реализацию, нормализуя поведение между браузерами)
Если вам нужно поддерживать все браузеры, рассмотрите возможность использования библиотеки, такой как web-socket-js,SignalR или гнездо.Ио который поддерживает несколько транспортных протоколов, таких как веб-сокетов, ГСП, навсегда рамы и AJAX долго голосование. Они часто требуют изменений на стороне сервера, а также.
Узнайте больше о SSE от:
- HTML5 Rocks article
- спецификация W3C (опубликованная версия,редактора)
Узнайте больше о WebSockets от:
- HTML5 Rocks article
- спецификация W3C (опубликованная версия,редактора черновик)
другие отличия:
- WebSockets поддерживает произвольные двоичные данные, SSE использует только UTF-8
Opera, Chrome, Safari поддерживает SSE, Chrome, Safari поддерживает SSE внутри SharedWorker Firefox поддерживает XMLHttpRequest readyState interactive, поэтому мы можем сделать EventSource polyfil для Firefox
Websocket VS SSE
Web Sockets - это протокол, который обеспечивает полный дуплексный канал связи через одно соединение TCP. Например, двусторонняя связь между сервером и браузером Поскольку протокол является более сложным, сервер и браузер должны полагаться на библиотеку websocket а это
socket.ioExample - Online chat application.SSE (Server-Sent Event) - В случае отправленного сервером события общение осуществляется от сервера к браузеру и браузер не может отправить данные на сервер. Этот вид связи в основном используется когда нужно только показать обновленные данные, то сервер отправляет сообщение всякий раз, когда данные обновляются. Например, односторонняя связь между сервером и браузером. Этот протокол менее сложен, поэтому нет необходимости полагаться на внешнюю библиотеку JAVASCRIPT сам предоставляет
EventSourceинтерфейс для получения отправленных сервером сообщения.Example - Online stock quotes or cricket score website.
одна вещь, чтобы отметить:
У меня были проблемы с websockets и корпоративными брандмауэрами. (Использование HTTPS помогает, Но не всегда.)см.https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94
Я предположим существует не так много проблем с событиями, отправленными сервером. Но я не знаю.
тем не менее, WebSockets-это тонны удовольствия. У меня есть немного веб-игра, которая использует websockets (через Socket.IO) (http://minibman.com)
WebSocket и SSE являются альтернативой традиционной веб-архитектуре запроса-ответа, но они не являются точно конкурирующими технологиями. Архитектура WebSocket состоит из сокета, который открывается между клиентом и сервером для полнодуплексной (двунаправленной) связи. Вместо отправки сообщения GET и ожидания ответа сервера, клиент просто слушает сокет, получая обновления сервера и используя данные для инициирования или поддержки различных взаимодействия. Клиент также может использовать сокет для связи с сервером, например, отправив сообщение ACK, когда обновление было успешно получено.
SSE-это более простой стандарт, разработанный как расширение HTML5. Хотя SSE включает асинхронные сообщения от сервера к клиенту, клиент не может отправлять сообщения на сервер. Модель полудуплексной связи SSE лучше всего подходит для приложений, где клиент просто должен получать потоковые обновления от сервер. Одним из преимуществ SSE над WebSocket является то, что он работает через HTTP, не требуя дополнительных компонентов.
для многоцелевого веб-приложения, требующего обширной связи между клиентом и сервером, WebSocket является очевидным выбором. SSE больше подходит для приложений, которые хотят передавать асинхронные данные клиенту с сервера, но не требуют ответа обратно.
Comments