sgcWebSockets 与 Chilkat 对比
面向正在权衡两者的 Delphi 和 C++ Builder 开发者的对比,全部标注来源。下面每一条关于 Chilkat 的说明都引自或取自 Chilkat 的页面,并在“来源”表格中给出链接,核对时间为 2026 年 9 月 6 日,对应 Chilkat 11.6.0 版本(2026 年 9 月 4 日发布)。每一条关于 sgcWebSockets 的说明都在同一天对照正式发行的 Object Pascal 源码核对过。
面向正在权衡两者的 Delphi 和 C++ Builder 开发者的对比,全部标注来源。下面每一条关于 Chilkat 的说明都引自或取自 Chilkat 的页面,并在“来源”表格中给出链接,核对时间为 2026 年 9 月 6 日,对应 Chilkat 11.6.0 版本(2026 年 9 月 4 日发布)。每一条关于 sgcWebSockets 的说明都在同一天对照正式发行的 Object Pascal 源码核对过。
这两个产品之间最重要的差别不是某项功能,而是它们各自以什么方式进入你的工程。两种选择都是有意为之,各自换来了对方拿不到的东西。
eSeGeCe · Object Pascal 组件
一千多个 Object Pascal 单元,由 Delphi 编译器链接进你的可执行文件。你只需安装一次设计时包,组件就会出现在 IDE 组件面板的 SGC 页上,属性和事件都是 published 的,因此对象查看器和窗体设计器的表现与任何其他 VCL 或 FireMonkey 组件完全一致。实现代码就在磁盘上,可以单步进入调试器,也可以在本地打补丁。
Chilkat Software · 跨语言库
面向多种编程语言发布的同一个库。对于 Delphi,Chilkat 把它描述为“一个带扁平化、可由 Pascal 调用的 API 的原生库”:Windows 上是 ChilkatDelphi32.dll 或 ChilkatDelphi64.dll,Linux 和 Android 上是 .so,macOS 上是按架构分的 .dylib,iOS 上是静态 .a 库,再加上每个类一个“小型 .pas 接口单元”,由你加入 uses 子句。对象都是不透明句柄。它不是 ActiveX,也从不需要 regsvr32。
Chilkat 声明其 API 在各编程语言之间完全一致,并且一份许可“在所有受支持的操作系统、编程语言、架构和框架上均有效”。同样的类名和同样的方法名出现在 C#、VB.NET、Java、Python、Go、Node.js、PHP、Ruby、Swift、Objective-C、Perl、Tcl、PureBasic、Xojo、B4X、DataFlex、PowerShell 等语言中。如果你的组织已经在一个 C# 服务和一个 Python 作业里调用 Chilkat,那么再从 Delphi 调用它,在许可上不需要额外花钱,学习成本也极低。单一语言的组件库无法提供这一点。
统一的跨语言 API 的代价,是它无法为任何一门语言量身定制。Chilkat 公布的 Delphi 下载包内容清单中没有设计时包,因此组件面板上不会出现任何东西,也没有对象查看器里的配置。Chilkat 还在文档中写明“Chilkat 的方法(在任何编程语言中)都不会通过抛出异常来表示失败。所有失败都通过方法的返回值来表示”,详细信息可从 LastErrorText 属性获取。对于一个必须在它所支持的每一种语言中都长得一样的库来说,这是一致的设计,只不过它并不是 Delphi 的习惯写法,因此建立在它之上的 Delphi 代码库,其错误处理读起来会与周围的代码不同。
由于单元是按类来命名的,Chilkat 提供了 Crypt2.pas、Http.pas、Zip.pas 等等。Chilkat 预料到这在大型工程中可能引发冲突,因此附带了 rename_units.bat 和 rename_units.py,它们会给每个单元加上 ck_ 前缀,并同步修正每个文件内的 unit 声明。sgcWebSockets 给每个单元和每个类都加上 sgc 和 Tsgc 前缀,因此不存在这个问题。在把两者中的任何一个加入既有代码库之前,这一点值得先知道,它并不是对谁的扣分。
对勾表示厂商在文档中记录了该能力。短横线表示它没有出现在厂商自己公开的类清单或文档中,我们核对的就是这些,它并不代表该产品经过开发之后能做什么。波浪线表示部分支持,或者我们无法找到任何一方的明确文档。下面的“来源”表格列出了查阅过的每一个页面。
| 功能 | sgcWebSockets | Chilkat |
|---|---|---|
| WebSocket 客户端(RFC 6455) 连接到 WebSocket 端点并交换帧 | ||
| WebSocket 服务器(RFC 6455) 监听、接受客户端并提供 WebSocket 连接服务 | — | |
| per-message-deflate(RFC 7692) WebSocket 压缩扩展 | ~ | |
| MQTT 客户端(3.1.1 / 5.0) 在 TCP 或 WebSocket 上发布与订阅 | — | |
| AMQP 客户端(0.9.1 / 1.0) 面向 RabbitMQ 及兼容 broker 的消息通信 | — | |
| STOMP 客户端 基于文本帧的 broker 协议,适用于 ActiveMQ 和 RabbitMQ | — | |
| WAMP 客户端 在 WebSocket 上实现 RPC 与发布订阅 | — | |
| Server-Sent Events 消费 HTTP 事件流 | ~ | |
| HTTP/2 客户端 原生 HTTP/2 客户端,RFC 7540 / 9113 | ~ | |
| MCP 客户端 Model Context Protocol 客户端 | ||
| MCP 服务器 为 AI 模型托管工具与资源 | — | |
| AI 厂商客户端 OpenAI, Anthropic, Gemini, Grok, Mistral, DeepSeek | ||
| 加密货币交易所客户端 面向具名交易所的带类型 WebSocket 客户端 | — |
| 功能 | sgcWebSockets | Chilkat |
|---|---|---|
| IDE 组件面板上的组件 设计时安装、对象查看器、窗体设计器 | — | |
| 实现代码编译进你的可执行文件 库被链接进 EXE,无需部署厂商的运行时 | — | |
| 以 Delphi 异常形式报告失败 符合语言习惯的 try/except 与 OnException 处理 | — | |
| Delphi 7 厂商声明支持的最老 Delphi 版本 | ||
| Delphi 13 Florence 厂商声明支持的最新 Delphi 版本 | ||
| C++ Builder 已发布受支持的 C++ Builder 发行版 | ||
| Lazarus / Free Pascal 已发布 Lazarus 或 FPC 的发行版 | ||
| Windows、macOS、Linux、iOS、Android 厂商发布了全部五个目标平台 | ||
| 其他编程语言中的同一套 API 在 Object Pascal 之外也能用到完全相同的 API | ~ |
| 功能 | sgcWebSockets | Chilkat |
|---|---|---|
| 电子邮件:SMTP、POP3、IMAP 邮箱访问与邮件撰写 | — | |
| SFTP、SSH、SCP、FTP 文件传输与远程 shell | — | |
| PDF、ZIP、TAR、S/MIME 文档与归档处理 | — | |
| XML 与 CAdES 数字签名 XMLDSig、代码签名、证书处理 | — | |
| 云存储客户端 S3、Azure Storage、Dropbox、Google Drive、OneDrive、SharePoint、Box | — | |
| 对称与公钥密码学 AES、RSA、ECC、哈希、密钥派生函数 | ||
| 包含实现的源代码 API 背后的代码随许可一起提供 | — | |
| 免版税再分发 分发编译后的应用无需按份收费 | ||
| 功能完整的评估版 带有全部功能、有时间限制的构建 |
逐行说明。MQTT、AMQP、STOMP 和 WAMP 这几行读自 Chilkat 的 Delphi DLL 参考索引,该索引列出了 103 个类,其中没有对应这四者中任何一个的类。per-message-deflate 和 HTTP/2 两行标注波浪线,是因为 Chilkat 的 WebSocket 和 Http 类参考文档中都没有提到它们,而没有提及并不能证明不存在。Server-Sent Events 的波浪线则反映出 Chilkat 的 ServerSentEvent 类在文档中被描述为事件流文本的解析器,而不是一个流式 HTTP 客户端。C++ Builder 那一行两边都是对勾,但发行形态并不相同:Chilkat 为 Win32 和 Win64 上的 C++ Builder 12 和 13 发布静态库,而 sgcWebSockets 提供从 2007 到 13 共十八个 C++ Builder 版本的包工程。在电子邮件、文件传输、文档和云存储几行中,sgcWebSockets 是短横线,因为这些不在本产品之内;eSeGeCe 把签名和 PDF 相关工作作为单独的产品出售,而本页只比较 sgcWebSockets。还有两个细节值得从表格里带走:Chilkat 声明对 Delphi 7 的支持仅限 Windows,而两份 AI 厂商清单接近但并不相同,Chilkat 那边点名了 Perplexity,sgcWebSockets 这边点名了 Ollama。
同一个任务在两个产品中的写法。Chilkat 那段代码是从 Chilkat 自己公开的 Delphi DLL 示例精简而来,为了篇幅去掉了其中的错误检查;sgcWebSockets 那段代码使用 TsgcWebSocketClient 公开的属性和事件。
uses
sgcWebSocket, sgcWebSocket_Classes;
// FClient is a TsgcWebSocketClient field on the form
procedure TForm1.FormCreate(Sender: TObject);
begin
FClient := TsgcWebSocketClient.Create(Self);
FClient.Host := 'echo.example.com';
FClient.Port := 443;
FClient.TLS := True;
// reconnect automatically if the link drops
FClient.WatchDog.Enabled := True;
FClient.WatchDog.Interval := 10;
FClient.WatchDog.Attempts := 0;
FClient.OnMessage := ClientMessage;
FClient.Active := True;
end;
procedure TForm1.ClientMessage(Connection: TsgcWSConnection;
const Text: string);
begin
Memo1.Lines.Add(Text);
end;
procedure TForm1.SendClick(Sender: TObject);
begin
FClient.WriteData('hello');
end;
uses
System.SysUtils, Rest, WebSocket;
procedure TForm1.Button1Click(Sender: TObject);
var
success: Boolean;
rest: HCkRest;
ws: HCkWebSocket;
responseBody: PWideChar;
statusCode: Integer;
begin
// the WebSocket runs over an established Chilkat Rest connection
rest := CkRest_Create();
success := CkRest_Connect(rest, 'someserver.com', 80, False, False);
ws := CkWebSocket_Create();
success := CkWebSocket_UseConnection(ws, rest);
// add the open-handshake headers, then send the GET
CkWebSocket_AddClientHeaders(ws);
responseBody := CkRest__fullRequestNoBody(rest, 'GET', '/something');
statusCode := CkRest_getResponseStatusCode(rest);
// 101 is expected, then validate Sec-WebSocket-Accept
success := CkWebSocket_ValidateServerHandshake(ws);
if success <> True then
Memo1.Lines.Add(CkWebSocket__lastErrorText(ws));
CkRest_Dispose(rest);
CkWebSocket_Dispose(ws);
end;
精简自 Chilkat 公开在 example-code.com/delphiDll/websocket_connect.asp 的代码。完整版本会检查每一次调用的返回值,并在失败时打印 LastErrorText,这正是 Chilkat 在文档中给出的错误模型。
Chilkat 明确说明它的 WebSocket 类是客户端,并为监听一侧提供了一个单独的 Socket 类。
“Chilkat.WebSocket 实现的是 WebSocket 协议的客户端一侧。它向一个已有的 WebSocket 服务器发起打开握手。它不监听进来的连接,不接受客户端,也不实现 WebSocket 服务器。”Chilkat 另有一个 Socket 类确实覆盖服务器端套接字,文档描述为“在实现简单的套接字服务器或自定义监听流程时,监听并接受进来的客户端连接”,因此可以在它之上搭建一个 WebSocket 服务器。握手、分帧、控制帧以及任何扩展都要由你自己写。
uses
sgcWebSocket, sgcWebSocket_Classes;
// FServer is a TsgcWebSocketServer field on the form
procedure TForm1.FormCreate(Sender: TObject);
begin
FServer := TsgcWebSocketServer.Create(Self);
FServer.Port := 8080;
FServer.OnMessage := ServerMessage;
FServer.Active := True;
end;
procedure TForm1.ServerMessage(Connection: TsgcWSConnection;
const Text: string);
begin
// answer this client
Connection.WriteData('echo: ' + Text);
// or tell everybody
FServer.Broadcast(Text);
end;
TsgcWebSocketServer 和 TsgcWebSocketHTTPServer 从 Professional 版本起注册。Delphi 功能矩阵列出了每个版本包含哪些组件。
两个产品对编译后的应用都是免版税的。差别在于是否有东西必须跟着可执行文件一起走。
“Chilkat 的 DLL 必须与你应用的 EXE 位于同一目录。”Chilkat 建议用一个构建后事件把目标平台对应的 DLL 复制过去,并列出了文件缺失时会看到的错误。Windows 上发布了三个二进制文件:32 位、64 位,以及面向 Windows on Arm 目标的 Arm64EC 构建。
Linux 通过常规的加载器搜索路径来解析 libchilkatdelphi_x86_64.so,而该路径不包含可执行文件自己所在的目录,因此 Chilkat 在文档中给出两种做法:用 ldconfig 做系统级安装,或者设置 LD_LIBRARY_PATH。macOS 上的 dylib 由 Chilkat 做了代码签名,并与可执行文件放在一起分发。iOS 使用链接进应用的静态库;Android 则把每个 ABI 对应的一个 .so 打包进 APK。Chilkat 声明 Linux 构建需要 glibc 2.27 或更新版本。
这个库会编译进可执行文件,因此在任何平台上都不需要部署 sgc 的运行时。唯一还可能需要文件的是 TLS:OpenSSL 后端需要有 OpenSSL 库存在,而 Windows 上的 SChannel 后端从 Professional 版本起可用,它使用操作系统自带的实现,不需要任何额外文件。
上面矩阵中出现分歧的那些行,汇总在一处。Chilkat 的条目来自 Chilkat 公开的类清单和产品页面,sgcWebSockets 的条目来自正式发行的 Object Pascal 源码。
TsgcWebSocketServer 和 TsgcWebSocketHTTPServer 从 Professional 版本起注册,而 TsgcWebSocketClient 从 Standard 版本起注册。Chilkat 的文档把它的 WebSocket 类记录为仅客户端。电子邮件、文件传输、文档和云存储这几行缺的是 sgcWebSockets,而不是 eSeGeCe:签名和 PDF 相关工作作为单独的产品出售,而本页只比较 sgcWebSockets。
两家厂商都公开了自己的条款。价格会变,所以本节只描述授权模式并给出价格页面的链接,不引用具体数字。
一份 Bundle 许可覆盖 Chilkat 的每一个类。Chilkat 把它描述为“一份不会过期的永久许可”,并配有一个维护期,用于管理升级到更新版本的权利;如果维护期失效超过三个月,Chilkat 声明必须按常规价格重新购买许可。级别分为 1 名开发者、最多 4 名开发者,以及最多 8 名开发者的团队。该许可免版税,Chilkat 声明可再分发文件可以包含在你的安装程序中,并可在任意数量的计算机或服务器上使用。这些库“在 30 天评估期内功能完整”,只要向 UnlockBundle 传入任意字符串即可解锁。
按版本销售,分为 Standard、Professional 和 Enterprise,每个版本又分 Single、Team 和 Site 三个层级,包含一年更新和完整的 Object Pascal 源码。EULA 授予基于这些组件构建的编译后可执行文件免版税分发的权利,源码版本允许本地修改,但禁止再分发源码本身。另有一条编译后 DCU 的产品线 sgcWebSockets Basic,单独定价。sgcWebSockets 的 .NET 版本是一个独立产品,有自己的许可,因此与 Chilkat 不同,一次购买并不能跨语言使用。
两家厂商都公开了联系方式。本节只转述各自的说法,不评价实际效果。
Chilkat 的帮助页面把技术问题引向一个邮箱地址,并指向参考文档、example-code.com 上数百个可直接运行的 Delphi DLL 示例、tools.chilkat.io 上的在线代码生成器,以及 Chilkat 的博客。参考文档覆盖每一种受支持语言中的每一个类,示例站点则按任务组织。
sgcWebSockets 的支持通过 eSeGeCe 的技术支持系统进行,网站上还提供在线帮助、可下载的用户手册、随包附带的示例工程和发布历史。由于除 Basic 之外的每个版本都附带源码,一次技术支持对话可以直接指向你和对方眼前都有的某一行代码。
开发者在两者之间做决定时会问的问题。
.so,macOS 上是按架构分的 .dylib,iOS 上是静态 .a 库,每个类配一个 Pascal 接口单元,由你加入 uses 子句。对象都是句柄,因此 CkWebSocket_Create 返回一个 HCkWebSocket,你要把它作为每次调用的第一个参数传入,并用 CkWebSocket_Dispose 释放。Chilkat 公布的下载包内容清单中没有设计时包,因此组件面板上不会出现任何东西。sgcWebSockets 走的是另一条路:编译进你工程的 Object Pascal 单元,并在 IDE 组件面板上注册组件。Socket 类确实可以接受进来的 TCP 连接,因此可以在它之上写一个 WebSocket 服务器,但分帧、握手和扩展相关的工作都要由你来做。sgcWebSockets 从 Professional 版本起提供 TsgcWebSocketServer 和 TsgcWebSocketHTTPServer。LD_LIBRARY_PATH 找到。CkHttp 和 CkJsonObject 的团队,可以把这份经验直接带进 Delphi,不需要额外的许可成本,这是单一语言的组件库无法比拟的优势。Chilkat 公开的类清单中没有 WebSocket 服务器,也没有 MQTT、AMQP、STOMP 或 WAMP。sgcWebSockets 这五项都覆盖,但只支持 Object Pascal。.pas 接口单元,外加预先构建好的二进制文件;实现代码在二进制文件内部,Chilkat 不发布源码版本。sgcVer.inc 中的编译器定义,后者才决定每个版本实际包含什么。下面所有 Chilkat 页面都是在 2026 年 9 月 6 日阅读的,对应 2026 年 9 月 4 日的 Chilkat 11.6.0 版本。如果你发现本页有内容与 Chilkat 自己的材料不再一致,请告诉我们,我们会更正。
其他对比。同样方式的对比还有 TMS Software 和 /n software 的 IPWorks,以及涵盖 Indy、ICS 和 mORMot 2 的更广泛综述 Delphi 与 C++ Builder WebSocket 库。如果选库的问题已经定了,你更想看代码,那么 Delphi 使用场景会一页一个任务,把你从空白窗体带到能跑起来的程序。