QUIC 客户端与服务器
TsgcQUICClient 和 TsgcQUICServer 使用原始 QUIC 通信:在一个加密连接上运行多个独立的流、不可靠数据报,以及当客户端 IP 地址在会话中途改变时的连接迁移。
TCP 加 TLS 需要三次往返,才能等到响应的第一个字节。QUIC 把传输层握手和加密握手合并成一次,恢复的连接甚至可以在第一个数据包中就发送数据。sgcQUIC 为 Delphi、C++ Builder 和 .NET 提供了一个原生 QUIC 传输,以及构建在其上的 HTTP/3 客户端和服务器,基于 OpenSSL 3.5 QUIC 引擎。
sgcQUIC 不是一个残缺的实现。传输、成帧、头部压缩以及 WebTransport 扩展全部涵盖,构建在原生 OpenSSL 3.5 QUIC 引擎之上。
如果需要自行定义帧格式的纯传输层,请使用 TsgcQUICClient 和 TsgcQUICServer;如果线上格式就是 HTTP,则直接使用 TsgcHTTP3Client 和 TsgcHTTP3Server。
TsgcQUICClient 和 TsgcQUICServer 使用原始 QUIC 通信:在一个加密连接上运行多个独立的流、不可靠数据报,以及当客户端 IP 地址在会话中途改变时的连接迁移。
TsgcHTTP3Client 和 TsgcHTTP3Server 在其上叠加 HTTP 语义:使用 QPACK 压缩的请求和响应头部、Alt-Svc 发现,以及您的 HTTP/2 代码已经在使用的相同方法和状态码。
之前连接过的客户端可以在第一个数据包中就发送首个请求,甚至在握手完成之前。
连接 ID 而非 IP 地址标识会话,因此手机从 Wi-Fi 切换到蜂窝网络时,其数据流仍能保持打开。
通过一次 Extended CONNECT 请求提供双向流和不可靠数据报,供支持 WebTransport 的浏览器客户端使用。
QUIC 和 HTTP/3 组件的实战指南:
和其他任何 sgcWebSockets HTTP 客户端一样的形态:设置属性、处理一个事件、调用一个方法。
uses
sgcHTTP3_Client;
var
vClient: TsgcHTTP3Client;
begin
vClient := TsgcHTTP3Client.Create(nil);
vClient.Host := 'api.example.com';
vClient.Port := 443;
vClient.OnResponse :=
procedure(Sender: TObject; const AStatus: Integer; const ABody: string)
begin
Memo1.Lines.Add(Format('%d: %s', [AStatus, ABody]));
end;
vClient.OnAltSvc :=
procedure(Sender: TObject; const AAltSvc: string)
begin
Memo1.Lines.Add('Alt-Svc: ' + AAltSvc); // h3 advertised over HTTP/2
end;
vClient.Connect;
vClient.Get('/pets/42');
end;
uses
sgcQUIC_Client;
var
vQUIC: TsgcQUICClient;
begin
vQUIC := TsgcQUICClient.Create(nil);
vQUIC.Host := 'quic.example.com';
vQUIC.Port := 4433;
vQUIC.EnableMultiStream := True;
vQUIC.OnQUICConnect :=
procedure(Sender: TObject)
var
vStreamId: Int64;
begin
vStreamId := vQUIC.OpenStream;
vQUIC.WriteData(vStreamId, 'ping');
end;
vQUIC.OnQUICStreamData :=
procedure(Sender: TObject; const AStreamId: Int64; const AData: string)
begin
Memo1.Lines.Add(Format('stream %d: %s', [AStreamId, AData]));
end;
vQUIC.Active := True;
end;
客户端和服务器在两侧共享同一套连接、流和数据报模型。完整功能矩阵 →
TsgcHTTP3Server 在一个 UDP 端口上通过 QUIC 提供 HTTP/3 服务,而以 TsgcHTTP3ServerBridge 方式与现有的 HTTP/2 服务器配对,则能让旧版客户端继续通过 TCP 正常工作。宣告 Alt-Svc 后,现代客户端会自动升级。
uses
sgcHTTP3_Server;
procedure TForm1.FormCreate(Sender: TObject);
begin
FServer := TsgcHTTP3Server.Create(nil);
FServer.Port := 443;
FServer.QUICOptions.SSLOptions.CertFile := 'server.crt';
FServer.QUICOptions.SSLOptions.KeyFile := 'server.key';
// One handler for every incoming HTTP/3 request
FServer.OnH3Request :=
procedure(const Ctx: TsgcHTTP3Context)
begin
if Ctx.Path = '/pets/42' then
Ctx.RespondJSON(200, '{"name":"Rex"}')
else
Ctx.Respond(404, 'Not found');
end;
FServer.Active := True;
end;
一个单独的 Delphi 组件即可终止 QUIC 连接、协商 h3,并将每个请求路由到一个处理程序,使用的是您的 HTTP/2 服务器已经加载的同一份证书。
一个普通的 HTTP/2 响应会携带一个 Alt-Svc: h3=":443" 头部。能识别它的客户端会在下一次请求时开启 QUIC,无需重定向,也不需要第二个域名。
一次 Extended CONNECT 请求就能把一个流升级为 WebTransport,让浏览器客户端在普通 HTTP/3 请求之外,还能获得双向流和数据报。
QUIC 和 TLS 1.3 握手运行在 OpenSSL 3.5 自身的 QUIC 引擎上。没有需要单独构建或引入的 QUIC 库。
sgcQUIC 是 sgcWebSockets Enterprise 的附加组件,因此许可证、支持渠道和更新节奏都和您已经拥有的一致。
sgcQUIC 是 eSeGeCe 面向 Delphi、C++ Builder 和 .NET 的九个组件库之一。它们共享同样的约定,提供完整源代码,并可免版税部署。
WebSocket、HTTP/2、MQTT、AMQP、WebRTC、AI 及 30+ API 集成。sgcQUIC 正是构建在这份 Enterprise 许可证之上。
了解更多 →面向 Delphi 和 C++ Builder 的 AI、LLM 和 MCP 组件。一个组件即可对接七家 LLM 提供商,另有 MCP、嵌入和语音。独立产品,随附 sgcWebSockets Core 运行时。
了解更多 →面向 Delphi 和 C++ Builder 的 MQTT、AMQP 0.9.1 和 1.0、Apache Kafka 与 STOMP 客户端组件。独立产品,随附 sgcWebSockets Core 运行时。
了解更多 →面向 Delphi 和 C++ Builder 的 OAuth2 客户端、JWT 客户端和 WebAuthn 支持。可对接任意 OAuth2/OIDC 提供商登录、签发并验证 JWT,并为原生应用添加通行密钥身份验证。独立产品,随附 sgcWebSockets Core 运行时。
了解更多 →面向 Delphi 和 C++ Builder 的 HTTP/2 客户端、gRPC 客户端以及 Google Cloud Pub/Sub、Calendar 和 FCM 客户端。独立产品,随附 sgcWebSockets Core 运行时。
了解更多 →面向 Delphi 和 C++ Builder 的 REST 服务器、OpenAPI 服务器和 OpenAPI 客户端组件。可从 OpenAPI 3.x 契约发布 REST API,或调用任何以 OpenAPI 描述的 API。独立产品,随附 sgcWebSockets Core 运行时。
了解更多 →受到全球各地 Delphi、C++ Builder、Lazarus 和 .NET 开发者的信赖。
你们的 sgcWebSockets 库非常实用,而且易于设置。请继续保持!
sgcWebSockets 非常出色,你们的支持也是最棒的!
非常感谢你们的帮助和支持,我很喜欢你们的组件。