sgcWebSockets 2026.6 是本库历史上规模最大的版本之一。它带来了三个全新的客户端(一个原生 gRPC 客户端、一个 Apache Kafka 客户端和一个独立的 OpenAPI 3 服务器),两个原生操作系统 TLS 后端,可让你的移动端和桌面应用在不带 OpenSSL 的情况下发布,防火墙中的仅分类型 机器人检测 引擎,面向 AI 智能体的 MCP stdio 传输,一组 后量子 加密原语,以及对 WebSocket 与 HTTP 服务器的全面 安全加固。
本文将带你逐一了解这些亮点,每项都附带一段简短的 Delphi 代码片段,以及指向深入介绍每个特性的专门文章的链接。
基于 HTTP/2 的 gRPC 客户端
全新的 TsgcGRPCClient 是一个构建在现有 TsgcHTTP2Client 之上的原生 gRPC 客户端,无需部署任何外部 gRPC 运行时。它支持四种 RPC 模式(一元、服务端流、客户端流和双向流)、用于压缩和内容类型的通道选项、默认元数据和按调用元数据、截止时间、带指数退避的自动重试、客户端负载均衡(Pick First 和 Round Robin)、gRPC 健康检查、服务端反射、拦截器以及 OpenTelemetry 指标。
uses
sgcHTTP2, sgcGRPC_Client, sgcGRPC_Classes, sgcGRPC_Types;
var
HTTP2: TsgcHTTP2Client;
GRPC: TsgcGRPCClient;
oResponse: TsgcGRPCResponse;
begin
HTTP2 := TsgcHTTP2Client.Create(nil);
HTTP2.Host := 'grpc.example.com';
HTTP2.Port := 443;
HTTP2.TLS := True;
GRPC := TsgcGRPCClient.Create(nil);
GRPC.Client := HTTP2;
// metadata is sent on every call (auth, tracing...)
GRPC.DefaultMetadata.Add('authorization', 'Bearer eyJ...');
// unary call: the request is your serialized protobuf message as TBytes
oResponse := GRPC.Call('helloworld.Greeter', 'SayHello', RequestBytes);
if oResponse.StatusCode = grpcOK then
Memo1.Text := oResponse.DataString
else
ShowMessage('gRPC error: ' + oResponse.StatusMessage);
end;
在通用客户端之上,2026.6 还为八个 Google Cloud 服务提供了类型化的 gRPC 接口,每个都带有 protobuf 请求和响应类以及服务账号 JWT 身份验证:Pub/Sub、Speech-to-Text、Translation、Vision、Natural Language、Cloud Storage、BigQuery Storage 和 Vertex AI。完整教程:gRPC Client for Delphi。
独立的 OpenAPI 3 服务器
TsgcWSAPIServer_OpenAPI 可将一份 OpenAPI 3 规范转化为运行中的 REST 服务器。加载一份规范(或通过 RTTI 特性从 Delphi 类生成一份),将其附加到 TsgcWebSocketHTTPServer,你便开箱即得路由、请求校验、Swagger UI 和 CORS。校验失败会自动返回 RFC 7807 problem+json。
uses
sgcWebSocket, sgcWebSocket_Classes,
sgcWebSocket_Server_API_OpenAPI,
sgcHTTP_OpenAPI_Server;
var
WSServer: TsgcWebSocketHTTPServer;
FOpenAPI: TsgcWSAPIServer_OpenAPI;
begin
WSServer := TsgcWebSocketHTTPServer.Create(nil);
WSServer.Port := 8080;
FOpenAPI := TsgcWSAPIServer_OpenAPI.Create(nil);
FOpenAPI.OnRequest := OnOpenAPIRequest;
FOpenAPI.OnValidationError := OnOpenAPIValidationError;
FOpenAPI.OpenAPIOptions.Endpoint.ServeSpec := True;
FOpenAPI.OpenAPIOptions.Endpoint.ServeSwaggerUI := True;
FOpenAPI.OpenAPIOptions.CORS.Enabled := True;
FOpenAPI.OpenAPIOptions.Validation.ValidateRequest := True;
FOpenAPI.LoadFromFile('petstore.json');
FOpenAPI.Server := WSServer;
WSServer.Active := True;
// Swagger UI: http://localhost:8080/docs
// Raw spec: http://localhost:8080/openapi.json
end;
阅读更多:OpenAPI Server for Delphi。
Apache Kafka 客户端
TsgcWSPClient_Kafka 是一个原生 Apache Kafka 客户端,它在原始 TCP 上使用二进制 Kafka 线路协议通信,无需依赖 Java 或 librdkafka。可生产和消费消息、订阅和轮询,并管理消费者组、主题和偏移量。
uses
sgcWebSocket, sgcWebSocket_Protocols, sgcKafka_Classes;
var
oClient: TsgcWebSocketClient;
oKafka: TsgcWSPClient_Kafka;
begin
oClient := TsgcWebSocketClient.Create(nil);
oClient.Specifications.RFC6455 := False; // raw TCP, native Kafka protocol
oClient.Host := '127.0.0.1';
oClient.Port := 9092;
oKafka := TsgcWSPClient_Kafka.Create(nil);
oKafka.Client := oClient;
oKafka.KafkaOptions.ClientId := 'my-delphi-app';
oKafka.OnKafkaConnect := OnKafkaConnect;
oKafka.OnKafkaMessage := OnKafkaMessage;
oKafka.OnKafkaProduce := OnKafkaProduce;
oClient.Active := True; // connect to the broker
end;
阅读更多:Apache Kafka Client for Delphi。
Android 与 Apple 上的原生 TLS,无需部署 OpenSSL
两个新的 TLS 后端通过操作系统而非 OpenSSL 来执行握手,因此你的应用在 Android 上无需附带 libssl.so / libcrypto.so,在 iOS 和 macOS 上也无需附带 .dylib。两者都通过 TLSOptions.IOHandler 按平台选择,并复用你已经在使用的同一套 TLSOptions API(自定义 CA、客户端证书、ALPN)。
Android(iohAndroidTLS)通过 JNI 使用平台的 javax.net.ssl.SSLEngine 来执行 TLS,会针对 Android 系统信任库进行验证并执行主机名校验,可协商 TLS 1.3,并在 Android 10 及更高版本上支持 ALPN。需要 RAD Studio XE8+。
uses
sgcWebSocket, sgcWebSocket_Types;
WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAndroidTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;
Apple(iohAppleTLS)会在 macOS 10.14+ 和 iOS 12+ 上自动选用 Network.framework 来实现 TLS 1.3,并在较旧系统上回退到 Secure Transport(TLS 1.2)。它使用系统信任库,并执行 SNI 和主机名校验,同时提供 OnAppleTLSVerifyPeer 事件以供自定义验证。需要 RAD Studio XE6+。
uses
sgcWebSocket, sgcWebSocket_Types;
WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAppleTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;
阅读更多:Native Android TLS 和 Native Apple TLS。
防火墙机器人检测
TsgcWebSocketFirewall 新增了一个基于 IP 的机器人检测模块,它使用已知机器人 CIDR 列表、数据中心 ASN 范围、正向确认反向 DNS(FCrDNS)和 DNSBL 查询,将客户端归类为经验证的搜索引擎爬虫、数据中心地址段或黑名单地址。它仅作分类:结果通过新的 OnBotDetected 事件和 GetBotClassification 方法暴露出来,因此由你决定如何处理,而不是由防火墙替你阻断连接。
TsgcBotClassification = (bcUnknown, bcVerifiedCrawler, bcDatacenter,
bcSuspectedBot, bcBlocklisted, bcHuman);
本版本还为防火墙带来了完整的 IPv6 支持:黑名单和白名单 CIDR 匹配可达 /128、GeoLite2 IPv6 国家/地区屏蔽、IPv6 机器人地址段以及 ip6.arpa 反向 DNS / DNSBL。一个长期存在的 bug 也已修复,此前 IPv6 CIDR 是用 32 位运算来求值的(因此会匹配每一个 IPv6 客户端)。阅读更多:Bot Detection in the Firewall。
MCP stdio 传输
通过新的 TsgcAI_MCP_Server_Stdio 宿主,Model Context Protocol 服务器和客户端现在可以通过标准输入/输出运行,因此你的 Delphi MCP 服务器可以被诸如 Claude Code 之类的 AI 智能体作为本地子进程启动。工具的注册方式与在 HTTP 服务器上完全相同。
uses
SysUtils, sgcAI_MCP_Server, sgcAI_MCP_Classes, sgcAI_MCP_Types;
var
oServer: TsgcAI_MCP_Server_Stdio;
oTool: TsgcAI_MCP_Tool;
begin
oServer := TsgcAI_MCP_Server_Stdio.Create(nil);
try
oServer.ServerInfo.Name := 'MyDelphiServer';
oServer.ServerInfo.Version := '1.0';
oTool := oServer.MCPServer.Tools.AddTool('add', 'Adds two numbers');
oTool.InputSchema.Properties.AddProperty('a', True, aimcpjtNumber);
oTool.InputSchema.Properties.AddProperty('b', True, aimcpjtNumber);
oServer.MCPServer.OnMCPRequestTool := OnRequestTool;
// read JSON-RPC from stdin, write responses to stdout, blocks until EOF
oServer.Run;
finally
oServer.Free;
end;
end.
阅读更多:MCP stdio Transport for Server and Client。
默认即加固
2026.6 修复了服务器中的一批拒绝服务和协议一致性问题,并将新的限制以带有安全默认值的属性形式暴露出来。
WebSocket 服务器现在通过 MaxMessageSize 来限制消息内存(默认 64 MB,0 = 无限制),会以关闭码 1009 拒绝超大消息、无休止的分片以及 permessage-deflate “zip 炸弹”。新增的 SecurityOptions.EnforceWebSocketVersion 和 SecurityOptions.ValidateWebSocketKey 会校验 RFC 6455 握手,两者均默认启用。
oServer := TsgcWebSocketServer.Create(nil);
oServer.Port := 80;
// accept messages up to 16 MB, reject anything larger with close 1009
oServer.MaxMessageSize := 16 * 1024 * 1024;
oServer.Active := True;
HTTP 服务器新增了 MaxRequestBodySize(默认 64 MB)和 StrictRequestParsing(默认 True,会拒绝同时携带 Content-Length 和 Transfer-Encoding 的请求)。静态文件服务中的路径遍历问题已修复,HTTP/2 Rapid Reset(CVE-2023-44487)通过按连接的 RST_STREAM 和控制帧限制得到缓解,并且 DocumentRoot 文件现在使用共享的 TFileStream 从磁盘流式读取,而不再被完整加载到内存中,因此无论文件大小或连接数量如何,服务器内存占用都保持平稳。
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.Port := 80;
oServer.MaxRequestBodySize := 16 * 1024 * 1024; // 16 MB, reject larger with 413
oServer.Active := True;
阅读更多:Hardening the WebSocket Server 和 Hardening the HTTP Server。
后量子与 AEAD 加密
对于构建混合后量子握手的应用,2026.6 新增了 ML-KEM-768 的封装和解封装(sgcKEM_MLKEM768_Encapsulate / Decapsulate,需 OpenSSL 3.5+),同时还提供了基于 P-256 的经典 ECDH-as-KEM(sgcKEM_ECDH_P256_Encapsulate / Decapsulate),它们共享相同的 TBytes API 形态,因此你可以在经典 KEM 和后量子 KEM 之间切换而无需改动代码。
新的 sgcSSL_AEAD 单元为 AES-128-GCM、AES-256-GCM 和 ChaCha20-Poly1305 提供了通用的 AEAD 原语(sgcAEAD_Encrypt / sgcAEAD_Decrypt),可由调用方提供 12 字节的 nonce 和任意 AAD。sgcAEAD_EncryptPrefixed / sgcAEAD_DecryptPrefixed 包装函数会生成并消费 Bouncy Castle GCM、JOSE A256GCM、libsodium 以及大多数 HPKE 风格协议所使用的自包含 “nonce(12) || ciphertext || tag(16)” 数据块。
uses
sgcSSL_AEAD;
var
vKey, vPlain, vBlob, vOut: TBytes;
begin
// vKey: 32 bytes from KEM Decapsulate + HKDF
vBlob := sgcAEAD_EncryptPrefixed(aeadAES256GCM, vKey, vPlain, nil);
vOut := sgcAEAD_DecryptPrefixed(aeadAES256GCM, vKey, vBlob, nil);
end;
账户下载 API
你的 eSeGeCe 账户上新增了一个 REST API,让你可以直接从脚本或 CI 中登录、列出并下载你的订阅有权获取的文件。它采用 OpenAPI 3.0 描述,并附带一个基于 sgcOpenAPI 构建、可直接使用的 Delphi 客户端。
curl -X POST https://www.esegece.com/api/v1/login \
-H "Content-Type: application/json" \
-d '{"username":"YOUR_USERNAME","password":"YOUR_PASSWORD"}'
阅读更多:Automate Your Downloads with the Account API。
本版本的其他更新
- 安装程序新增了 Include Resources 选项:取消勾选即可在编译前取消定义
SGC_RESOURCES并去掉内嵌的 JS 资源,从而减小应用体积。 - MQTT 5.0:修正了 Subscription Identifier 和 Server Reference 属性标识符,严格遵循 5.0 的对端此前可能会拒绝它们。
- AMQP 1.0:当大消息超过协商的 max-frame-size 时,现在会被拆分到多个帧中。
- STOMP:修复了当默认设置将传出间隔保持为 0 时出现的心跳泛洪问题。
- Server-Sent Events:回退重试值现在以毫秒发送,而不再乘以 1000。
- STUN / TURN:完整的 96 位密码学随机事务 id,并且 ChannelData 长度现在按 RFC 5766 排除了填充。
- 交易所 API:修复了 Bybit、Kraken 和 MEXC 流订阅的问题。已停用的 FXCM 客户端已被移除。
Options.WriteTimeOut现在可在 Linux 和其他 POSIX 平台上工作(SO_SNDTIMEO 以 timeval 形式传递),因此读取缓慢的客户端不再会无限期地阻塞服务器线程。
升级
2026.6 对现有的 2026.x 项目而言是一次直接替换式升级。服务器加固功能均带有安全默认值,因此唯一需要留意的是 64 MB 的默认 MaxMessageSize / MaxRequestBodySize:如果你的应用确实需要交换更大的负载,请提高该限制(或将其设为 0 表示无限制)以匹配你之前的行为。
拥有有效订阅的客户可从客户专区下载新版本,或从 esegece.com/products/websockets/download 下载。
有疑问、反馈或需要迁移帮助?联系我们。你将收到编写这些代码的人的回复。
