TsgcQUICServer › Eigenschaften › AlwaysMultiStream
Aktiviert den Multi-Stream-Modus, sodass der Server jeden vom Peer geöffneten Stream annimmt und liest, nicht nur den ersten.
property AlwaysMultiStream: Boolean read FAlwaysMultiStream write FAlwaysMultiStream;
False
QUIC multiplext viele Streams über eine Verbindung. Standardmäßig verwendet der Server ein bewusst einfaches Single-Stream-Modell: Er übernimmt den ersten bidirektionalen Stream, den der Peer öffnet, als Standard-Datenstream der Verbindung, liefert dessen Bytes über OnQUICData und ignoriert alle weiteren Streams, die der Peer öffnet.
Wenn Sie AlwaysMultiStream auf True setzen, ändert das dies für jede Verbindung. Der Server nimmt dann auch jeden zusätzlichen vom Peer geöffneten Stream an, verfolgt ihn als TsgcQUICServerStream in der Streams-Liste der Verbindung und liefert dessen Bytes über OnQUICStreamData, versehen mit der Stream-ID. Genau das benötigen Sie, wenn der Peer unidirektionale Steuerungs-Streams sendet oder mehrere bidirektionale Streams öffnet, um Anfragen gleichzeitig auszuführen.
Der Multi-Stream-Modus ändert auch, wie das Ende eines Streams behandelt wird. Im Single-Stream-Modus wird ein Peer, der den Standard-Stream beendet, als Ende der Verbindung gewertet und löst OnQUICDisconnect aus. Im Multi-Stream-Modus wird der Standard-Stream einfach freigegeben und die Verbindung bleibt bestehen, sodass nachfolgende Streams weiterhin bedient werden.
Die Eigenschaft ist der Schalter hinter der geschützten virtuellen Methode DoMultiStreamEnabled, die Nachkommen überschreiben können, um pro Verbindung zu entscheiden. TsgcHTTP3Server setzt in seinem Konstruktor AlwaysMultiStream := True und überschreibt diese Methode entsprechend, weil HTTP/3 verlangt, dass die unidirektionalen Control- und QPACK-Streams des Clients (RFC 9114) empfangen werden. Setzen Sie sie auf einem HTTP/3-Server nicht zurück.
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 := 'cert.pem';
oServer.QUICOptions.SSLOptions.KeyFile := 'key.pem';
// accept and read every stream the peer opens
oServer.AlwaysMultiStream := True;
oServer.OnQUICStreamData := OnQUICStreamDataEvent;
oServer.Start;
procedure TfrmServer.OnQUICStreamDataEvent(Sender: TObject;
const aConnection: TsgcQUICServerConnection; aStreamId: Int64;
aUnidirectional: Boolean; const aData: TBytes);
begin
Log(Format('%d bytes on stream %d (uni=%s)',
[Length(aData), aStreamId, BoolToStr(aUnidirectional, True)]));
end;