Websockets та SSE (Server Sent Events) обидва можуть надсилати дані до браузерів, однак вони не є конкуруючими технологіями.
З'єднання веб-розетки можуть як надсилати дані до браузера, так і отримувати дані від браузера. Хорошим прикладом програми, яка може використовувати веб-розетки, є програма для чату.
З'єднання SSE можуть передавати дані лише в браузер. Котирування акцій в Інтернеті або щебетати, що оновлюють часові шкали або канал, є хорошими прикладами програми, яка може отримати користь від SSE.
На практиці, оскільки все, що можна зробити з SSE, можна зробити і за допомогою Websockets, Websockets отримує набагато більше уваги та любові, і багато інших браузерів підтримують Websockets, ніж SSE.
Однак це може бути надмірним для деяких типів додатків, і бекенд може бути простіше реалізувати з таким протоколом, як SSE.
Крім того, SSE можна переповнити старими веб-переглядачами, які не підтримують його за допомогою JavaScript. Деякі реалізації поліелементів SSE можна знайти на сторінці Modernizr github .
Отримав:
- SSE страждає від обмеження максимальної кількості відкритих з'єднань, що може бути особливо болючим при відкритті різних вкладок, оскільки обмеження визначено для браузера і встановлене на дуже низьке число (6). У Chrome і Firefox проблему було позначено як "Не вдасться виправити" . Цей ліміт призначений для одного браузера + домену, тобто це означає, що ви можете відкрити 6 SSE-з'єднань на всіх вкладках до
www.example1.com
та ще 6 підключень SSE www.example2.com
(спасибі Phate).
- Лише WS може передавати як бінарні дані, так і UTF-8, SSE обмежений UTF-8. (Спасибі Чадо Ніхі).
- У деяких корпоративних брандмауерах при перевірці пакетів виникають проблеми з веб-розетками (брандмауер Sophos XG, WatchGuard, McAfee Web Gateway).
HTML5Rocks має хорошу інформацію про SSE. З цієї сторінки:
Події, надіслані сервером проти WebSockets
Чому б ви вибрали серверні події через WebSockets? Хороше питання.
Однією з причин, що SSE залишаються в тіні, є те, що пізніші API, такі як WebSockets, надають більш багатий протокол для здійснення двонаправленого, дуплексного зв'язку. Наявність двостороннього каналу привабливіше для таких речей, як ігри, додатки для обміну повідомленнями, а також для випадків, коли вам потрібно оновити в реальному часі в обох напрямках. Однак у деяких сценаріях дані не потрібно надсилати від клієнта. Вам просто потрібні оновлення від деяких дій сервера. Кілька прикладів - оновлення статусу друзів, біржові запаси, канали новин або інші автоматизовані механізми передачі даних (наприклад, оновлення клієнтської бази даних SQL на базі даних або об’єктного магазину IndexedDB). Якщо вам потрібно буде надіслати дані на сервер, XMLHttpRequest завжди є другом.
SSE передаються через традиційний HTTP. Це означає, що їм не потрібен спеціальний протокол або реалізація сервера для роботи. З іншого боку, для обробки протоколу WebSockets вимагають повного дуплексного з'єднання та нових серверів Web Socket. Окрім того, серверні події мають різні функції, яких WebSockets не вистачає в дизайні, такі як автоматичне повторне підключення, ідентифікатори подій та можливість надсилання довільних подій.
Підсумок TLDR:
Переваги SSE над Websockets:
- Транспортується через простий HTTP замість спеціального протоколу
- Можна наповнити javascript, щоб "підтримувати" SSE для браузерів, які ще не підтримують його.
- Вбудована підтримка повторного підключення та ідентифікатора події
- Простіший протокол
- Немає проблем з корпоративними брандмауерами, які роблять перевірку пакетів
Переваги Websockets над SSE:
- В режимі реального часу, двонаправлене спілкування.
- Рідна підтримка у більшості браузерів
Ідеальні випадки використання SSE:
- Поточний тикер потоку
- оновлення каналу Twitter
- Повідомлення для браузера
SSE отримали:
- Немає бінарної підтримки
- Максимальна межа відкритого з'єднання