sgcWebSockets unterstützt eine Vielzahl von Protokollen. HTTP/2 ist das Protokoll, das gerade in Entwicklung ist.
HTTP 1.1 war in den letzten 15 Jahren das meistgenutzte HTTP-Protokoll und ist weit in Servern und Clients verbreitet. Mit dem Wachstum des Internets, dem Wachstum der Anwendungen und Webseiten und der zunehmenden Datenmenge wurden die Schwächen von HTTP 1.1 immer deutlicher: im Grunde eine Anfrage pro Verbindung und das Duplizieren von Anfragen.
HTTP 2 bringt einige Vorteile mit:
- Multiplexed: erlaubt das Teilen einer einzigen Verbindung für mehrere Anfragen
- Header-Komprimierung: weniger Daten zu senden.
- Server-Push: der Server kann dem Client Ressourcen senden, von denen er annimmt, dass der Client sie braucht.
HTTP 1.1 testen
Der Test ist sehr einfach: Den Server 100-mal nach einem Bild fragen, eines nach dem anderen. Wenn das erste fertig ist, geht die zweite Anfrage raus und so weiter.
procedure TestHTTP1;
begin
oHTTP := TIdHTTP.Create(nil);
Try
for i := 1 to 100 do
begin
oStream := TMemoryStream.Create;
Try
oHTTP.Get('https://ik.imagekit.io/demo/img/http_test/h_' + Format('%.2d', [i]) + '.jpg', oStream);
oJPEG := TJPEGImage.Create;
oJPEG.Scale := jsHalf;
oStream.Position := 0;
oJPEG.LoadFromStream(oStream);
...
TThread.Queue(nil,
procedure
begin
FRMHTTP2_Client.imgHTTP.Canvas.Draw(vCol * 50, vRow * 50, oJPEG);
end);
Finally
oStream.Free;
End;
end;
Finally
oHTTP.Free;
Terminate;
end;
end;
HTTP 2.0 testen
Der Test ist noch einfacher als bei HTTP 1.1: Einfach die http2-Komponente anlegen und 100-mal eine GET-Anfrage absetzen. Es ist nicht nötig, auf eine Antwort zu warten, denn die Antworten werden asynchron ausgeliefert, sobald der Client sie empfängt.
procedure TestHTTP2;
var
oHTTP2: TsgcHTTP2Client;
begin
oHTTP2 := TsgcHTTP2Client.Create;
oHTTP2.OnHTTP2Response := OnHTTP2ResponseEvent;
oHTTP2.Request.Accept := 'image/*,*/*;q=0.8';
for i := 1 to 100 do
oHTTP2.Get('https://ik.imagekit.io/demo/img/http_test/h_' + Format('%.2d', [i]) + '.jpg');
end;
procedure OnHTTP2ResponseEvent(const Connection: TsgcHTTP2ConnectionClient; const Request: TsgcHTTP2RequestProperty; const Response: TsgcHTTP2ResponseProperty);
var
oJPEG: TJPEGImage;
vCol, vRow: Integer;
begin
oJPEG := TJPEGImage.Create;
oJPEG.LoadFromStream(Response.Data);
oJPEG.Scale := jsHalf;
...
TThread.Queue(nil,
procedure
begin
if Assigned(imgHTTP2) then
begin
imgHTTP2.Canvas.Draw(vCol * 50, vRow * 50, oJPEG);
end;
end);
end;
Und der Gewinner ist...
Wahrscheinlich weißt du schon, welches Protokoll schneller ist. Du kannst es selbst mit folgender kompilierten Demo für Windows ausprobieren.
HINWEIS: In der Demo läuft der HTTP1.1-Test in einem Sekundär-Thread, während HTTP2.0 asynchron ist und daher keinen Sekundär-Thread benötigt.
