sgcWebSockets 支持多种协议,HTTP/2 是目前正在开发中的协议。
HTTP 1.1 在过去 15 年中一直是最广泛使用的 HTTP 协议,在服务器和客户端中被大量实现。但随着互联网的发展,应用程序和网站规模不断增大,加载数据量持续增加,HTTP 1.1 的局限性日益突出,主要表现为每个连接只能处理一个请求以及请求重复问题。
HTTP/2 具有以下优势:
- 多路复用:允许单个连接处理多个请求
- 请求头压缩:减少需要传输的数据量
- 服务器推送:服务器可主动向客户端推送其预判需要的资源
测试 HTTP 1.1
测试非常简单,依次向服务器请求同一张图片 100 次,第一次完成后再发送第二次请求,以此类推。
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
测试比 HTTP 1.1 更为简单:只需创建 HTTP/2 组件,调用 100 次 GET 请求,无需等待响应,因为响应在客户端收到时会异步分发。
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;
胜者是……
您可能已经知道哪种协议更快,您可以使用以下已编译的 Windows 演示程序自行测试。
注意:在演示程序中,HTTP 1.1 测试运行在辅助线程中,而 HTTP/2 是异步的,无需在辅助线程中运行。
