sgcWebSockets admite una amplia gama de protocolos; HTTP/2 es el protocolo que está en desarrollo ahora mismo.
HTTP 1.1 ha sido el protocolo HTTP más usado y ampliamente implementado en servidores y clientes durante los últimos 15 años. Pero a medida que internet crecía, las aplicaciones y webs crecían y la cantidad de datos cargados aumentaba, las deficiencias de HTTP 1.1 se hicieron más evidentes. Básicamente una petición por conexión y duplicación de peticiones.
HTTP 2 tiene algunas ventajas como:
- Multiplexed: permite compartir una única conexión para múltiples peticiones
- Compresión de cabeceras: menos datos que enviar.
- Server push: el servidor puede enviar al cliente algunos recursos que cree que necesitará.
Probando HTTP 1.1
La prueba es muy simple: llama al servidor para obtener una imagen 100 veces, una por una, de modo que cuando termina la primera, se envía la segunda petición y así sucesivamente
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;
Probando HTTP 2.0
La prueba es aún más simple que con HTTP 1.1: solo tienes que crear el componente http2 y llamar 100 veces a get request; no hay necesidad de esperar a obtener una respuesta porque las respuestas se despachan de forma asíncrona cuando son recibidas por el cliente.
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;
Y el ganador es...
Lo más probable es que ya sepas qué protocolo es más rápido; puedes probarlo tú mismo usando la siguiente demo compilada para windows.
NOTA: en la demo, la prueba HTTP1.1 se ejecuta en un hilo secundario y HTTP2.0 es asíncrona, por lo que no necesita ejecutarse en un hilo secundario.
