Echtzeitkommunikation in Delphi — Protokoll wählen

WebSocket, Server-Sent Events, HTTP/2-Server-Push, MQTT, AMQP und WebRTC lösen alle dieselbe Aufgabe: „Den Client benachrichtigen, wenn etwas passiert.“ Sie haben grundverschiedene Betriebsprofile — diese Seite ist der Spickzettel, um das richtige zu wählen.

Eine Bibliothek, sechs Echtzeit-Protokolle

sgcWebSockets liefert jeden Mainstream-Delphi-Echtzeit-Client und -Server out of the box mit — die Frage ist nicht mehr „Kann ich das in Pascal?“, sondern „Welches Protokoll passt zur Aufgabe?“

Echtzeitkommunikation in Delphi“ ist ein Sammelbegriff — in der Praxis umfasst er sechs fundamental unterschiedliche Netzwerkprimitive, jedes mit eigenen Eigenschaften bei Latenz, Reihenfolge, Fan-Out, NAT-Traversal und Infrastruktur. Die falsche Wahl kostet Monate: Du fährst eine Polling-REST-Schleife, läufst gegen Skalierungsgrenzen, rüstest eine WebSocket-Schicht nach und merkst dann, dass MQTT besser gepasst hätte, weil dein Traffic fundamental Pub/Sub ist. Diese Seite ist der kurze, klare Leitfaden.

Welches Protokoll — in einer Tabelle

Scanne die Zeilen; die Spalte mit den meisten Grüns gewinnt.

Anforderung WebSocket SSE HTTP/2-Push MQTT AMQP WebRTC
BidirektionalJaNein (nur Server→Client)NeinJa (Pub/Sub)Ja (Pub/Sub)Ja (Peer)
Fan-Out-BroadcastServerseitig implementiertNur pro ClientNur pro StreamNativ (Topics)Nativ (Exchanges)Nein (1:1)
Browser-UnterstützungJaJaJaÜber WebSocketÜber WebSocketJa
Durch Firmen-ProxyÜber wss://443Ja (wirkt wie HTTP)JaÜber WSSÜber WSSOft (TURN)
Garantierte AuslieferungApp-seitigApp-seitigApp-seitigQoS 1/2Ack-basiertSCTP zuverlässig
Schmalbandige GeräteMittelNiedrigMittelHervorragendMittelMittel
P2P / NAT-TraversalNein (Server)NeinNeinNein (Broker)Nein (Broker)Ja (ICE)
Ende-zu-Ende-verschlüsseltTLS Hop-by-HopTLS Hop-by-HopTLS Hop-by-HopTLS Hop-by-HopTLS Hop-by-HopDTLS-SRTP E2E
Server kann in Delphi laufenJaJaJaExternen Broker nutzenExternen Broker nutzenJa (Signalling + STUN/TURN)

Kurzfassung

WebSocket

Standardwahl. Bidirektional, geringer Overhead, läuft in jedem Browser. Wähle es für Live-Dashboards, Chats, kollaboratives Editieren, eigene Anwendungsprotokolle. Komponente →

Server-Sent Events

Wähle es, wenn der Verkehr nur Server → Client läuft und du das einfachste Modell willst: eine langlebige HTTP-Antwort, die Text streamt. In jedem Browser ohne Bibliothek eingebaut. SSE →

HTTP/2-Push

Nutze es, um Sub-Ressourcen (CSS, JS, JSON) präventiv mit dem Hauptdokument zu senden — spart einen Round-Trip. Kein allgemeiner „Push“-Kanal. HTTP/2 →

MQTT

Pub/Sub für IoT, Telemetrie, Mobile-Presence, vernetzte Fahrzeuge. QoS 1/2, Retained Messages, Last Will, winziger Wire-Overhead. Benötigt einen Broker. MQTT →

AMQP

Enterprise-Messaging: dauerhafte Queues, Exchanges, Routing-Keys, Dead-Letter-Handling, RabbitMQ / Azure Service Bus / IBM MQ. Wähle es statt MQTT, wenn du reichhaltiges Routing brauchst. AMQP →

WebRTC

Direkter Peer-to-Peer mit NAT-Traversal — Data Channels für Kollaboration, später Audio/Video. Die einzige Option für E2E-verschlüsseltes P2P. WebRTC →

So sieht jedes davon aus

Das minimal nötige Delphi-Snippet zum Verbinden mit jedem Protokoll — dieselbe Bibliothek, dasselbe Komponenten-Muster.

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');

HTTP/2 multiplexed GET

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]));

WebRTC-Data-Channel

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;

Drei Fehler, die du vermeiden solltest

REST in einer Schleife pollen

Wenn du dich beim Aufruf von Get alle zwei Sekunden wiederfindest und die Antwort diffst, ist die Antwort fast immer SSE (nur Server→Client) oder WebSocket (bidirektional). Die CPU- und Bandbreitenersparnis liegt routinemäßig bei 95 %+.

WebSocket wählen, wo MQTT passt

Wenn dein Verkehr fundamental topic-basiertes Fan-Out ist (Geräte publishen Telemetrie, Dashboards subscriben), reimplementiert ein eigenes JSON-über-WebSocket-Protokoll MQTT schlecht. Nutze den Broker.

HTTP/2-Push mit Server-Push verwechseln

Der HTTP/2-Push-Promise ist eine Sub-Ressourcen-Optimierung, kein allgemeiner Push-Kanal. Für langlebige Server-zu-Client-Streams willst du weiterhin SSE, WebSocket oder MQTT.

Jedes Protokoll erkunden

Delphi-WebSocket-Komponente

Der Flaggschiff-Transport.

Delphi-MQTT-Client

Pub/Sub für IoT und Telemetrie.

Delphi-HTTP/2-Client

Multiplexed HTTP und Push.

Delphi-WebRTC-Bibliothek

Peer-to-Peer-Data-Channels.

Server-Sent Events

Einfaches Server→Client-Streaming.

AMQP

Enterprise-Messaging über RabbitMQ, Service Bus, IBM MQ.

Blog: SSE-Client-Walkthrough

Praxis-SSE-Beispiel.

Blog: Loadbalancing für Echtzeit

Wie man nginx / Envoy / ALB vor WebSocket und HTTP/2 setzt.

Jedes Protokoll aus einem Installer ausprobieren

Lade die Testversion — Demos für WebSocket, SSE, MQTT, AMQP, HTTP/2 und WebRTC sind alle dabei.