sgcWebSockets prend en charge un large éventail de protocoles. HTTP/2 est le protocole actuellement en cours de développement.
HTTP 1.1 a été le protocole HTTP le plus utilisé et largement implémenté côté serveur et client durant les 15 dernières années. Mais à mesure qu'Internet a grandi, que les applications et les sites web ont grandi et que la quantité de données chargées a augmenté, les limites de HTTP 1.1 sont devenues plus visibles. Pour l'essentiel : une seule requête par connexion et la duplication des requêtes.
HTTP 2 présente plusieurs avantages :
- Multiplexé : permet de partager une seule connexion pour plusieurs requêtes
- Compression des en-têtes : moins de données à envoyer.
- Server push : le serveur peut envoyer au client certaines ressources qu'il pense nécessaires.
Test HTTP 1.1
Le test est très simple : il suffit d'appeler le serveur pour obtenir une image 100 fois, une par une. Quand la première se termine, la seconde requête est envoyée, et ainsi de suite.
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;
Test HTTP 2.0
Le test est encore plus simple qu'avec HTTP 1.1 : crée le composant http2, et appelle 100 fois la requête get. Pas besoin d'attendre une réponse, car les réponses sont dispatchées de façon asynchrone lorsqu'elles sont reçues par le client.
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;
Et le gagnant est…
Tu sais probablement déjà quel protocole est le plus rapide : tu peux le tester toi-même avec la démo compilée pour Windows.
REMARQUE : dans la démo, le test HTTP 1.1 s'exécute dans un thread secondaire et HTTP 2.0 est asynchrone : il n'a donc pas besoin de s'exécuter dans un thread secondaire.
