TsgcQUICServer › Ereignisse › OnQUICData
Wird ausgelöst, wenn Anwendungsdaten von einem Peer über dessen Standard-QUIC-Stream empfangen werden.
property OnQUICData: TsgcQUICServerDataEvent;
// TsgcQUICServerDataEvent = procedure(Sender: TObject; const aConnection: TsgcQUICServerConnection; const aData: TBytes) of object
—
| Name | Typ | Beschreibung |
|---|---|---|
Sender | TObject | Die TsgcQUICServer-Instanz. |
aConnection | const TsgcQUICServerConnection | Die Verbindung, von der die Bytes stammen, und das Handle, über das geantwortet wird. Siehe TsgcQUICServerConnection. |
aData | const TBytes | Der in diesem Durchgang gelesene Datenblock, höchstens 8192 Bytes. Keine Nachrichtengrenze, siehe die Hinweise. |
OnQUICData wird immer dann ausgelöst, wenn Anwendungsbytes vom Standard-QUIC-Stream der Verbindung gelesen werden, dem ersten bidirektionalen Stream, den der Peer geöffnet hat. Bytes, die auf einem anderen Stream eintreffen, werden stattdessen von OnQUICStreamData gemeldet, und nur im Multi-Stream-Modus.
aData ist ein Block, keine Nachricht. Der Server liest in Blöcken von bis zu 8192 Bytes und löst das Ereignis einmal pro Block aus, sodass eine logische Nachricht auf mehrere Aufrufe verteilt sein kann und mehrere kleine Nachrichten in einem eintreffen können. QUIC garantiert die Reihenfolge innerhalb eines Streams, übernimmt aber kein Framing für Sie, wenn Ihr Protokoll also Nachrichtengrenzen hat, puffern Sie pro Verbindung und setzen Sie auf Anwendungsebene wieder zusammen.
Antworten Sie, indem Sie WriteData mit derselben aConnection aufrufen, was aus diesem Ereignis heraus immer sicher ist, da der Standard-Stream hier per Definition existiert.
Dieses Ereignis läuft im Hintergrund-Listener-Thread des Servers, und die gesamte QUIC-Ereignisschleife ist blockiert, während Ihr Handler läuft, und zwar für jede Verbindung, nicht nur für diese. Halten Sie den Handler kurz und synchronisieren Sie mit dem Haupt-Thread, bevor Sie die UI anfassen. Eine hier ausgelöste Ausnahme wird abgefangen und über OnQUICException gemeldet.
TsgcHTTP3Server verbindet dieses Ereignis in seinem Konstruktor mit einem eigenen Handler, weisen Sie es daher auf einem HTTP/3-Server nicht zu, verwenden Sie stattdessen die HTTP/3-Ereignisse.
procedure OnQUICDataEvent(Sender: TObject; const aConnection: TsgcQUICServerConnection; const aData: TBytes);
begin
// echo the received bytes back to the peer
oServer.WriteData(aConnection, aData);
end;