Comunicación en tiempo real en Delphi — Elige tu protocolo

WebSocket, Server-Sent Events, server push HTTP/2, MQTT, AMQP y WebRTC resuelven todos “empuja al cliente cuando ocurra algo”. Tienen perfiles operativos radicalmente diferentes — esta página es la chuleta para escoger el adecuado.

Una librería, seis protocolos en tiempo real

sgcWebSockets incluye en la caja todos los clientes y servidores en tiempo real mainstream de Delphi — así la pregunta deja de ser “¿puedo hacer esto en Pascal?” y pasa a ser “¿qué protocolo encaja con el trabajo?”.

Comunicación en tiempo real en Delphi” es un término paraguas — en la práctica cubre seis primitivas de red fundamentalmente distintas, cada una con propiedades distintas de latencia, ordenación, fan-out, traversal de NAT e infraestructura. Elegir mal cuesta meses: lanzas un bucle de polling REST, te topas con techos de escalabilidad, retrofitas una capa WebSocket y entonces descubres que MQTT habría encajado mejor porque tu tráfico es fundamentalmente pub/sub. Esta página es la guía corta y opinada.

Qué protocolo — en una sola tabla

Repasa las filas; la columna con más verde gana.

Necesidad WebSocket SSE Push HTTP/2 MQTT AMQP WebRTC
BidireccionalNo (sólo servidor→cliente)NoSí (pub/sub)Sí (pub/sub)Sí (peer)
Broadcast fan-outImplementado en servidorSólo por clienteSólo por streamNativo (topics)Nativo (exchanges)No (1:1)
Soportado en navegadorVía WebSocketVía WebSocket
A través de proxy corporativoVía wss://443Sí (parece HTTP)Vía WSSVía WSSA menudo (TURN)
Entrega garantizadaA nivel appA nivel appA nivel appQoS 1/2Con ackSCTP fiable
Dispositivos de bajo ancho de bandaMedioBajoMedioExcelenteMedioMedio
P2P / traversal de NATNo (servidor)NoNoNo (broker)No (broker)Sí (ICE)
Cifrado de extremo a extremoTLS por saltoTLS por saltoTLS por saltoTLS por saltoTLS por saltoDTLS-SRTP E2E
El servidor puede correr en DelphiUsa broker externoUsa broker externoSí (señalización + STUN/TURN)

Versión corta

WebSocket

Elección por defecto. Bidireccional, bajo sobrecoste, funciona en cualquier navegador. Elígelo para dashboards en vivo, chat, edición colaborativa, protocolos de aplicación personalizados. Componente →

Server-Sent Events

Elígelo cuando el tráfico es sólo servidor → cliente y quieres el modelo más simple posible: una respuesta HTTP de larga vida que hace streaming de texto. Integrado en cada navegador sin librería. SSE →

Push HTTP/2

Úsalo para enviar preventivamente sub-recursos (CSS, JS, JSON) junto con el documento principal — ahorra un round-trip. No es un canal “push” de propósito general. HTTP/2 →

MQTT

Pub/sub para IoT, telemetría, presencia móvil, vehículos conectados. QoS 1/2, mensajes retained, last-will, sobrecoste de wire mínimo. Necesita un broker. MQTT →

AMQP

Mensajería empresarial: colas duraderas, exchanges, routing keys, dead-letter, RabbitMQ / Azure Service Bus / IBM MQ. Elígelo sobre MQTT cuando necesites enrutamiento rico. AMQP →

WebRTC

Peer-to-peer directo con traversal de NAT — data channels para colaboración, eventualmente audio/vídeo. La única opción para P2P cifrado E2E. WebRTC →

Cómo se ve cada uno

El snippet Delphi mínimo viable para conectarse con cada protocolo — misma librería, mismo patrón de componente.

WebSocket

WS := TsgcWebSocketClient.Create(nil);
WS.URL := 'wss://echo.websocket.events';
WS.OnMessage := DoMessage;
WS.Active := True;
WS.WriteData('hello');

Server-Sent Events

SSE := TsgcWSPClient_SSE.Create(nil);
SSE.URL := 'https://stream.example.com/events';
SSE.OnEvent := DoEvent;
SSE.Active := True;

MQTT

MQTT := TsgcWSPClient_MQTT.Create(nil);
MQTT.Client := WSClient;
MQTT.OnMQTTPublish := DoMqttPublish;
WSClient.Active := True;
MQTT.Subscribe('sensors/+/temperature', mtqsAtLeastOnce);

AMQP

AMQP := TsgcWSPClient_AMQP.Create(nil);
AMQP.Client := WSClient;
AMQP.OnAMQPMessage := DoAmqpMessage;
WSClient.Active := True;
AMQP.Consume('orders');

GET multiplexado HTTP/2

H2 := TsgcHTTP2Client.Create(nil);
H2.Host := 'api.example.com';
H2.Port := 443;
H2.TLS  := True;
H2.OnResponse := DoResponse;
H2.Connect;
for i := 1 to 10 do H2.Get(Format('/items/%d', [i]));

Data channel WebRTC

RTC := TsgcWSPClient_WebRTC.Create(nil);
RTC.Client := WSSignal;
RTC.IceServers.Add.URL := 'stun:stun.l.google.com:19302';
RTC.OnDataChannelMessage := DoP2PMessage;
WSSignal.Active := True;
RTC.CreateDataChannel('chat', True, True);
RTC.CreateOffer;

Tres errores que vale la pena evitar

Polling REST en bucle

Si te ves llamando a Get cada dos segundos y comparando la respuesta, la solución es casi siempre SSE (sólo servidor→cliente) o WebSocket (bidireccional). Los ahorros de CPU y ancho de banda son rutinariamente del 95 %+.

Elegir WebSocket cuando MQTT encaja

Si tu tráfico es fundamentalmente fan-out basado en topics (dispositivos publicando telemetría, dashboards suscribiendo), correr un protocolo JSON-sobre-WebSocket personalizado reimplementa MQTT mal. Usa el broker.

Confundir push HTTP/2 con server push

Push promise HTTP/2 es una optimización de sub-recursos, no un canal push de propósito general. Para streams server-to-client de larga vida sigues queriendo SSE, WebSocket o MQTT.

Explora cada protocolo

Componente WebSocket Delphi

El transporte estrella.

Cliente MQTT Delphi

Pub/sub para IoT y telemetría.

Cliente HTTP/2 Delphi

HTTP multiplexado y push.

Librería WebRTC Delphi

Data channels peer-to-peer.

Server-Sent Events

Streaming sencillo servidor→cliente.

AMQP

Mensajería empresarial vía RabbitMQ, Service Bus, IBM MQ.

Blog: recorrido del cliente SSE

Ejemplo SSE práctico.

Blog: balanceo de carga en tiempo real

Cómo poner nginx / Envoy / ALB delante de WebSocket y HTTP/2.

Prueba cada protocolo desde un único instalador

Descarga la versión de prueba — las demos para WebSocket, SSE, MQTT, AMQP, HTTP/2 y WebRTC vienen todas en la caja.