TsgcQUICServer › Ereignisse › OnQUICStreamData
Wird mit Bytes ausgelöst, die aus einem zusätzlichen QUIC-Stream gelesen wurden, versehen mit dessen Stream-ID. Erfordert den Multi-Stream-Modus.
property OnQUICStreamData: TsgcQUICServerStreamDataEvent;
// TsgcQUICServerStreamDataEvent = procedure(Sender: TObject; const aConnection: TsgcQUICServerConnection; aStreamId: Int64; aUnidirectional: Boolean; const aData: TBytes) of object
—
| Name | Typ | Beschreibung |
|---|---|---|
Sender | TObject | Die TsgcQUICServer-Instanz. |
aConnection | const TsgcQUICServerConnection | Die Verbindung, zu der der Stream gehört. Siehe TsgcQUICServerConnection. Rufen Sie deren FindStreamById mit aStreamId auf, um einen TsgcQUICServerStream zu erhalten, in den Sie schreiben können. |
aStreamId | Int64 | Die QUIC-Stream-ID, auf der diese Bytes eingetroffen sind, oder -1, wenn sie nicht gelesen werden konnte. Verwenden Sie sie zum Demultiplexen, mehrere Streams einer Verbindung werden über dieses eine Ereignis verschachtelt. |
aUnidirectional | Boolean | True, wenn der Stream nur in eine Richtung läuft, abgeleitet aus Bit 0x02 der Stream-ID. Auf einem vom Peer geöffneten unidirektionalen Stream können Sie nicht zurückschreiben. |
aData | const TBytes | Der in diesem Durchgang gelesene Datenblock. Keine Nachrichtengrenze, siehe die Hinweise. |
Dieses Ereignis ist das Multi-Stream-Gegenstück zu OnQUICData. OnQUICData überträgt den einzelnen Standard-Datenstream der Verbindung, während OnQUICStreamData jeden anderen Stream überträgt, jeweils identifiziert durch aStreamId.
Es wird nur im Multi-Stream-Modus ausgelöst. Setzen Sie AlwaysMultiStream auf True, andernfalls akzeptiert der Server niemals zusätzliche Streams und dieses Ereignis bleibt stumm.
Der Transport liest einen Stream nur, wenn der Peer ihn geöffnet hat oder wenn er bidirektional ist. Ein unidirektionaler Stream, den der Server mit OpenStream geöffnet hat, dient nur zum Schreiben und meldet hier niemals etwas.
aData ist genau das, was der Lesevorgang zurückgegeben hat, keine gerahmte Nachricht. Eine logische Nachricht kann über mehrere Aufrufe hinweg eintreffen, und Streams sind ineinander verschachtelt, puffern Sie daher pro aStreamId und setzen Sie die Nachricht auf Anwendungsebene wieder zusammen. Wenn der Peer einen Stream abschließt, verwirft der Transport ihn stillschweigend und die Verbindung bleibt bestehen, es gibt kein Schließereignis pro Stream.
Weisen Sie dieses Ereignis nicht auf einem TsgcHTTP3Server zu. Diese Komponente setzt AlwaysMultiStream und verbindet OnQUICStreamData in ihrem Konstruktor mit einem eigenen Handler, weil HTTP/3 die Control- und QPACK-Streams des Clients (RFC 9114) auf diesem Weg zustellt. Ein Überschreiben zerstört die HTTP/3-Schicht. Verwenden Sie stattdessen die HTTP/3-Ereignisse.
Anders als die übrigen QUIC-Server-Ereignisse ist OnQUICStreamData public, nicht published, es erscheint daher nicht im Objektinspektor und muss aus dem Code zugewiesen werden. Es ist in erster Linie ein Transport-Hook für höhere Protokolle wie WebTransport.
Dieses Ereignis läuft im Hintergrund-Listener-Thread des Servers, marshallen Sie daher zum Haupt-Thread, bevor Sie die UI ansprechen.
Dieses Member ist derzeit nur in der Delphi/C++Builder-Implementierung verfügbar. Die .NET-Implementierung liest nur den ersten eingehenden Stream pro Verbindung und stellt keine Multi-Stream-Schnittstelle bereit.
oServer := TsgcQUICServer.Create(nil);
oServer.Port := 4433;
oServer.QUICOptions.SSLOptions.CertFile := 'server.crt';
oServer.QUICOptions.SSLOptions.KeyFile := 'server.key';
oServer.AlwaysMultiStream := True; // required, or the event never fires
oServer.OnQUICStreamData := OnQUICStreamDataEvent;
oServer.Start;
procedure TfrmServer.OnQUICStreamDataEvent(Sender: TObject;
const aConnection: TsgcQUICServerConnection; aStreamId: Int64;
aUnidirectional: Boolean; const aData: TBytes);
var
oStream: TsgcQUICServerStream;
begin
Log(Format('%d bytes on stream %d (uni=%s)',
[Length(aData), aStreamId, BoolToStr(aUnidirectional, True)]));
if aUnidirectional then
Exit; // the peer owns the write side of its one-way stream
// echo back on the same stream
oStream := aConnection.FindStreamById(aStreamId);
if Assigned(oStream) then
oServer.WriteStreamData(oStream, aData);
end;