sgcWebSockets supporta un'ampia gamma di protocolli, HTTP/2 è il protocollo attualmente in sviluppo.
HTTP 1.1 è stato il protocollo HTTP più utilizzato e ampiamente implementato in server e client durante gli ultimi 15 anni. Ma con la crescita di internet, le applicazioni e i siti web sono cresciuti e la quantità di dati caricati è aumentata, le carenze di HTTP 1.1 sono diventate più evidenti. Sostanzialmente una richiesta per connessione e la duplicazione delle richieste.
HTTP 2 ha alcuni vantaggi come:
- Multiplexed: permette di condividere una singola connessione per più richieste
- Compressione degli header: meno dati da inviare.
- Server push: il server può inviare al client alcune risorse che ritiene gli serviranno.
Test di HTTP 1.1
Il test è molto semplice, basta chiamare il server per ottenere un'immagine 100 volte, una per una, quindi quando la prima termina, viene inviata la seconda richiesta e così via.
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 di HTTP 2.0
Il test è ancora più semplice rispetto a HTTP 1.1, basta creare il componente http2 e chiamare 100 volte la richiesta GET, non c'è bisogno di attendere una risposta perché le risposte vengono inviate in modo asincrono quando vengono ricevute dal 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;
E il vincitore è...
Molto probabilmente sai già quale protocollo è più veloce, puoi testarlo da te usando la seguente demo compilata per Windows.
NOTA: nella demo, il test HTTP1.1 viene eseguito in un thread secondario e HTTP2.0 è asincrono quindi non ha bisogno di essere eseguito in un thread secondario.
