sgcWebSockets ondersteunt een breed scala aan protocollen; HTTP/2 is het protocol dat op dit moment in ontwikkeling is.
HTTP 1.1 is de afgelopen 15 jaar het meest gebruikte HTTP-protocol geweest en is breed geïmplementeerd in servers en clients. Maar naarmate het internet groeide, applicaties en websites groter werden en de hoeveelheid geladen data toenam, werden de tekortkomingen van HTTP 1.1 duidelijker. In essentie: één aanvraag per verbinding en duplicatie van aanvragen.
HTTP 2 heeft een aantal voordelen, zoals:
- Multiplexed: maakt het mogelijk om één verbinding te delen voor meerdere aanvragen
- Headercompressie: minder data om te versturen.
- Server push: de server kan de client bronnen sturen die hij denkt nodig te hebben.
HTTP 1.1 testen
De test is heel simpel: roep de server 100 keer aan om één voor één een afbeelding op te halen, dus zodra de eerste klaar is, wordt de tweede aanvraag verstuurd, enzovoort
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
De test is nog eenvoudiger dan met HTTP 1.1: maak de http2-component aan en doe 100 keer een GET-aanvraag; je hoeft niet op een antwoord te wachten, omdat antwoorden asynchroon worden verwerkt wanneer ze door de client worden ontvangen.
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;
En de winnaar is...
Hoogstwaarschijnlijk weet je al welk protocol sneller is; je kunt het zelf testen met de volgende gecompileerde demo voor Windows.
OPMERKING: in de demo draait de HTTP1.1-test in een aparte thread en is HTTP2.0 asynchroon, dus daarvoor is geen aparte thread nodig.
