Por qué una solicitud HTTP normal es como una carta por correo, y SSE es un telegrama en tiempo real
\n\nImagine: está esperando una notificación sobre un nuevo comentario en un sitio web. Actualiza la página cada 5 segundos. El servidor devuelve cada vez un montón de HTML, CSS, imágenes — y solo entonces, al final, ve: «No hay nuevos comentarios». ¿Le suena? Esto se llama polling. Funciona, pero consume ancho de banda y sobrecarga el servidor.
\n\nAhora imagine otro escenario: abre una página y, un segundo después, aparece un mensaje: «Vasiliy dejó un comentario: "¡Artículo genial!"». Sin recargar, sin solicitudes adicionales. El servidor mismo le «empuja» los datos. Esto son los Server-Sent Events (SSE) — una tecnología que permite al servidor enviar al cliente un flujo de eventos a través de una conexión HTTP normal.
\n\nEn este artículo, analizaremos cómo implementar SSE en C++ puro sin usar frameworks pesados. Aprenderá por qué Server-Sent Events en C++ es una excelente opción para monitoreo, cotizaciones bursátiles, notificaciones de chat y cualquier tarea que requiera transmisión unidireccional de datos en tiempo real.
\n\n¿Cómo funcionan los Server-Sent Events? Análisis del protocolo
\n\nSSE es parte de la especificación HTML5. El cliente abre una conexión HTTP normal y le dice al servidor: «Estoy listo para escuchar eventos». En respuesta, el servidor no cierra la conexión, sino que comienza a enviar datos en un formato especial text/event-stream.
El formato del mensaje es extremadamente simple:
\n\ndata: Este es el texto del evento\\n\\n\n\nCada evento comienza con data: y termina con un doble salto de línea. Se puede agregar id: para identificación, event: para el tipo de evento y retry: para especificar el tiempo de reconexión en milisegundos.
Ejemplo de un flujo completo:
\n\nid: 42\nevent: new_message\ndata: {"user": "Vasiliy", "text": "¡Hola!"}\n\nid: 43\nevent: ping\ndata: El servidor está vivo\n\n\n\nEl cliente (navegador o cualquier aplicación) procesa estas líneas y genera eventos de JavaScript. Todo lo ingenioso es simple.
\n\nSSE vs WebSocket: ¿cuándo elegir qué?
\n\nMuchos piensan inmediatamente en WebSocket cuando se trata de tiempo real. Comparemos:
\n\n- \n
- WebSocket — comunicación bidireccional. El cliente y el servidor pueden iniciar el intercambio. Requiere un protocolo separado (ws://), paso a través de proxies, a menudo bloqueado por firewalls corporativos. \n
- SSE — comunicación unidireccional (servidor → cliente). Funciona sobre HTTP normal. Se reconecta automáticamente en caso de interrupción. Pasa fácilmente a través de cualquier proxy. \n
Si su tarea es enviar notificaciones al cliente, y no esperar comandos de él, Server-Sent Events en C++ es una solución elegante y simple. No necesita arrastrar bibliotecas pesadas, ni escribir manejadores complejos.
\n\nEscribimos un servidor SSE en C++ desde cero
\n\nPara la implementación necesitamos un mínimo: sockets y trabajo con HTTP. En proyectos reales se usa Boost.Beast o libmicrohttpd, pero para entender la esencia escribiremos un servidor simple en C++ puro usando sockets POSIX.
\n\nNuestro servidor:
\n- \n
- Aceptará una solicitud HTTP del cliente \n
- Determinará que el cliente quiere SSE (por el encabezado
Accept: text/event-stream) \n - Enviará un flujo de eventos con la hora actual cada 2 segundos \n
Paso 1: Creamos un socket y escuchamos en un puerto
\n\n#include <iostream>\n#include <string>\n#include <cstring>\n#include <unistd.h>\n#include <arpa/inet.h>\n#include <sys/socket.h>\n#include <thread>\n#include <chrono>\n#include <sstream>\n\nvoid handle_client(int client_socket) {\n // Buffer para la solicitud\n char buffer[4096] = {0};\n read(client_socket, buffer, 4096);\n \n // Verificamos que sea una solicitud GE