Tanto WebSockets como los eventos enviados por el servidor son capaces de enviar datos a los navegadores. Para mí, parecen ser tecnologías competidoras. ¿Cuál es la diferencia entre ellos? ¿Cuándo elegirías uno sobre el otro?
html
browser
websocket
server-sent-events
Mads Mobæk
fuente
fuente
curl
. Dado que es solo un formato de texto a través de HTTP, es fácil ver lo que está sucediendo.Respuestas:
Websockets y SSE (Server Sent Events) son capaces de enviar datos a los navegadores, sin embargo, no son tecnologías competidoras.
Las conexiones de Websockets pueden enviar datos al navegador y recibir datos del navegador. Un buen ejemplo de una aplicación que podría usar websockets es una aplicación de chat.
Las conexiones SSE solo pueden enviar datos al navegador. Las cotizaciones de acciones en línea o los twitters que actualizan la línea de tiempo o el feed son buenos ejemplos de una aplicación que podría beneficiarse de SSE.
En la práctica, dado que todo lo que se puede hacer con SSE también se puede hacer con Websockets, Websockets está recibiendo mucha más atención y amor, y muchos más navegadores admiten Websockets que SSE.
Sin embargo, puede ser excesivo para algunos tipos de aplicaciones, y el backend podría ser más fácil de implementar con un protocolo como SSE.
Además, SSE se puede rellenar en navegadores más antiguos que no lo admiten de forma nativa utilizando solo JavaScript. Algunas implementaciones de polyfills SSE se pueden encontrar en la página de github Modernizr .
Gotchas:
www.example1.com
y otras 6 conexiones SSEwww.example2.com
(gracias Phate).HTML5Rocks tiene buena información sobre SSE. De esa página:
Resumen de TLDR:
Ventajas de SSE sobre Websockets:
Ventajas de Websockets sobre SSE:
Casos de uso ideales de SSE:
SSE gotchas:
fuente
De acuerdo con caniuse.com:
Puede usar un polyfill solo para clientes para extender el soporte de SSE a muchos otros navegadores. Esto es menos probable con WebSockets. Algunos polyfills de EventSource:
Si necesita soportar todos los navegadores, considere usar una biblioteca como web-socket-js , SignalR o socket.io que soporta múltiples transportes como WebSockets, SSE, Forever Frame y AJAX long sondeo. A menudo, también requieren modificaciones en el lado del servidor.
Obtenga más información sobre SSE en:
Obtenga más información sobre WebSockets en:
Otras diferencias
fuente
Opera, Chrome, Safari admite SSE, Chrome, Safari admite SSE dentro de SharedWorker Firefox admite XMLHttpRequest readyState interactivo, por lo que podemos hacer que EventSource polyfil para Firefox
fuente
Websocket VS SSE
Web Sockets: es un protocolo que proporciona un canal de comunicación full-duplex a través de una única conexión TCP. Por ejemplo, una comunicación bidireccional entre el servidor y el navegador Dado que el protocolo es más complicado, el servidor y el navegador tienen que confiar en la biblioteca de websocket que es
socket.io
SSE (Evento enviado por el servidor): en el caso de un evento enviado por el servidor, la comunicación se lleva a cabo solo del servidor al navegador y el navegador no puede enviar ningún dato al servidor. Este tipo de comunicación se utiliza principalmente cuando la necesidad es solo mostrar los datos actualizados, luego el servidor envía el mensaje cada vez que los datos se actualizan. Por ejemplo, una comunicación unidireccional entre el servidor y el navegador. Este protocolo es menos complicado, por lo que no es necesario confiar en la biblioteca externa JAVASCRIPT proporciona la
EventSource
interfaz para recibir los mensajes enviados por el servidor.fuente
Una cosa a tener en cuenta:
he tenido problemas con websockets y firewalls corporativos. (Usar HTTPS ayuda pero no siempre).
Ver https://github.com/LearnBoost/socket.io/wiki/Socket.IO-and-firewall-software https://github.com/sockjs/sockjs-client/issues/94
Yo supongo que no hay tantos problemas con los eventos enviados por el servidor. Pero no lo se.
Dicho esto, los WebSockets son muy divertidos. Tengo un pequeño juego web que usa websockets (a través de Socket.IO) ( http://minibman.com )
fuente
Aquí hay una charla sobre las diferencias entre los sockets web y los eventos enviados por el servidor. Desde Java EE 7, una API de WebSocket ya forma parte de la especificación y parece que los eventos enviados por el servidor se lanzarán en la próxima versión de la edición empresarial.
fuente
El límite máximo de conexión no es un problema con http2 + sse.
Fue un problema en http 1
fuente