Server-Sent Events en Java: cómo enviar datos en tiempo real sin WebSocket

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Server-Sent Events en Java: cuando WebSocket es demasiado y HTTP no es suficiente

\n\n

¿Alguna vez te has preguntado cómo funcionan los feeds de noticias en Twitter, las notificaciones en Telegram o los resultados en vivo de partidos deportivos? Parece que los datos llegan solos, sin necesidad de recargar la página. El secreto es simple: Server-Sent Events (SSE) — una tecnología que permite al servidor enviar datos al cliente en tiempo real a través de una conexión HTTP normal.

\n\n

En este artículo analizaremos Server-Sent Events en Java. Descubrirás por qué SSE suele ser más conveniente que WebSocket, cómo configurar el servidor con Java Servlet API y cómo recibir eventos en el cliente. El código será funcional, el estilo dinámico y los ejemplos lo más cercanos posible a tareas reales.

\n\n

¿Qué son Server-Sent Events y para qué sirven?

\n\n

Server-Sent Events (SSE) es un estándar W3C que permite al servidor "enviar" datos al cliente a través de una única conexión HTTP de larga duración. El cliente se suscribe a un flujo de eventos y el servidor envía mensajes a medida que aparecen.

\n\n

SSE es ideal para:

\n
    \n
  • Notificaciones — nuevos correos, mensajes, cambios de estado.
  • \n
  • Feeds de noticias — publicaciones, tweets, tipos de cambio.
  • \n
  • Monitoreo — registros, métricas del servidor, progreso de tareas.
  • \n
  • Datos en vivo — cotizaciones de acciones, resultados de partidos, clima.
  • \n
\n\n

A diferencia de WebSocket, SSE funciona solo en una dirección (servidor → cliente), pero esto es suficiente para la mayoría de los escenarios. Además, SSE utiliza HTTP normal, no requiere puertos adicionales y atraviesa fácilmente proxies y firewalls.

\n\n

Server-Sent Events vs WebSocket: ¿qué elegir?

\n\n

Si solo necesitas enviar datos del servidor al cliente (sin comunicación bidireccional), elige SSE. Es más simple, ligero y económico. WebSocket está justificado cuando el cliente también envía datos activamente (por ejemplo, en chats o juegos en línea).

\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CriterioServer-Sent EventsWebSocket
DirecciónServidor → ClienteBidireccional
ProtocoloHTTP/1.1, HTTP/2ws:// o wss://
Reconexión automáticaSí (integrada en el navegador)No (debe implementarse)
Complejidad de implementaciónBajaMedia/Alta
Soporte de navegadoresTodos los modernosTodos los modernos
\n\n

Para el sitio educativo PythonLib, elegimos Java porque es un lenguaje confiable para el desarrollo del lado del servidor. ¡Allá vamos!

\n\n

Parte del servidor: implementación de SSE en Java con Servlet API

\n\n

Empecemos con el servidor. La forma más sencilla es usar Java Servlets estándar. Necesitamos:

\n
    \n
  • Establecer el encabezado Content-Type: text/event-stream.
  • \n
  • Deshabilitar el almacenamiento en caché (Cache-Control: no-cache).
  • \n
  • Mantener la conexión abierta.
  • \n
  • Enviar datos en el formato data: ...\\n\\n.
  • \n
\n\n

Ejemplo 1: Servidor SSE simple con Java Servlet

\n\n

Creemos un servlet que envíe la hora actual cada 5 segundos.

\n\n
import javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.time.LocalTime;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorServ                

Blogs

Book Recommendations