Wiki:Delphi 第 3 方 TCP/IP 组件库的最新技术
Posted
技术标签:
【中文标题】Wiki:Delphi 第 3 方 TCP/IP 组件库的最新技术【英文标题】:Wiki: Current state of the art of Delphi 3rd party TCP/IP components libraries 【发布时间】:2011-08-08 05:22:36 【问题描述】:我已经有 18 个月没有做裸机 TCP/IP 了,所以我想知道目前的最新技术是什么。
我正在寻找积极和消极方面,同时开发服务器和客户端软件。 我将做一个需要坚如磐石的 TCP/IP 层的项目,所以对我来说这是一个重要方面:)
为了使它成为一个社区 wiki,我正在寻找更广泛的答案,而不仅仅是“坚如磐石”。因此,例如有关特征宽度的信息也值得赞赏。
我将使用答案中的相关方面更新问题,以获得对这些库进行平衡概述的 wiki 条目。
例如,请参阅下面的答案以及我过去在 Indy 的经验 我对Indy的异常处理和防冻有些矛盾,虽然习惯了,但还是觉得有些不自然。
现在我在 Delphi 2007(非 Unicode)和 XE(Unicode)中进行开发,所以我正在考虑的库应该至少支持这两个 Delphi 版本。
【问题讨论】:
+1,不明白为什么 -1 看起来像一个有效且格式正确的问题? @Johan:对于社区 wiki 来说应该没关系:meta.stackexchange.com/questions/11740/… 一条评论 - 原始 TCP 在过去 20 年中几乎没有变化。如果通过原始 TCP 实现,那么特性就完全无关紧要了。但是,如果您要实现更高级别的协议,那么特性可能是决定因素。 IOCP 支持(从 NT 3.5 开始)对于大型应用程序很有趣,并且部分可用:***.com/questions/2302267/… 不幸的是,在 Delphi 组件的情况下,“部分”也可能是“根本没有”。真的很想在 Delphi 中看到一个强大的 IOCP 实现,但我不会屏住呼吸 ;-) 【参考方案1】:编辑: 我过去在 Indy 和 cmets 上的经验总结(感谢 Eugene、Marjan) (请更新当前 Indy 的最新技术):
专业版:
与 Delphi 一起提供 成熟 开发社区 开源所以很多人都在仔细检查这些来源 源代码中包含大量有价值的注释文档 OpenSSL 支持 支持广泛的 Delphi 版本(包括 2007 和 XE) 多种协议选择缺点:
Delphi 附带的版本并不总是最稳定的;通常需要从源下载才能获得稳定的构建 (同时)在 Delphi 中存在大量重复代码(但 Indy 需要与旧版 Delphi 兼容) 并非所有 TCP/IP 组件都是最新的(例如,当时 POP3 客户端组件不支持一些基本的 POP3 命令) 版本互操作性很麻烦:从一个 Indy 版本升级到另一个版本可能非常耗时 我对 Indy 的异常处理和防冻有些矛盾,虽然习惯了,但还是觉得有些不自然。 在构建更新之间进行了重大更改; ifdefs 需要容纳这些 如果有的话,发布状态不清楚,很长一段时间没有 RC,获取主干可能会使您的本地副本不稳定【讨论】:
添加到专业人士 - 广泛的协议选择。添加到缺点 - 在构建更新之间进行重大更改。我们的 Indy 辅助类中有很多 ifdef 来适应这些重大变化。 添加到缺点:如果有的话,发布状态不清楚。很长一段时间没有发布候选版本,甚至没有“标记”为稳定的版本号。并且始终获取最新的资源不是一种选择,因为它会在您自己的产品中引入不稳定。 @Eugene, Marjan:谢谢,已更新。请注意,我们鼓励您更新答案,因为它是一个社区 wiki 答案。【参考方案2】:ICS - 互联网组件套件
ICS - see www.overbyte.be。弗朗索瓦·皮耶特的开源。对我来说,这一直是 Indy 的第一选择。这是最有趣的卖点:它使使用异步的东西变得容易,并且异步似乎更接近于“裸机”套接字编程。
我用它构建了一个相当复杂的 VNC 代理,其中代理本身(服务器)是用 ICS 构建的,而客户端是 Indy 和 ICS 的混合体。在高需求期间,代理处理大约 100 个同时连接和大约 10 个同时 VNC 屏幕会话。它平均消耗 5 mbit/s,通过两个不同的 Internet 连接处理连接。我不认为 100 + 10 是限制,因为服务器可以毫无问题地处理它,而且 CPU 使用率太低而无法提及。
优点:
异步工作 对初学者来说稍微容易一些,因为它不需要线程 支持大量协议缺点:
依赖于 Windows 消息传递。我对此很不适应。 异步行为使得大多数协议的实现有点困难(因为大多数协议都是发送命令/接收响应的形式)。这对大多数人来说并不重要,因为 ICS 为最常用的协议提供了现成的实现。话虽如此,我已经很长时间没有使用 ICS,我对所有的花里胡哨都不是最新的。这是CW,所以请编辑和扩展!
【讨论】:
【参考方案3】:自 2003 年以来,我一直使用 Indy 作为我自己的 TCP 通信框架。它坚如磐石,我有一个与 Delphi 2007 一起使用的版本,另一个与 Delphi 2010 一起使用的版本,如果您正确处理线程,则无需使用防冻剂,并且我在客户端和服务器上都有一致的异常处理通过实现我自己的包装器。
您可以在此处下载 (http://www.csinnovations.com/framework_delphi.htm) - 查找 Tcp 单元,主要是 AppTcpServerUnt 和 AppTcpClientUnt。
【讨论】:
经过检查,我的一台最近 3 个月一直在运行的服务器自启动以来已处理了 1.4 亿条消息和总共 40 GB 的数据。 我想试试你的框架,但需要了解如何 a) 停止线程,b) 使用 UI,c) 将消息发送到另一个线程,d) 将数据集发送到客户端。你的框架能做到这一点吗?谢谢。 看看开发指南,然后看看4Framework目录下的一些例子。这将为您提供一些背景信息。如果/当您需要更多信息时,请通过网站上的地址给我发电子邮件。 这听起来很有用,但现在链接已断开。能否请您更新指向其新位置的链接?【参考方案4】:我强烈推荐Clever Internet Suite,它是迄今为止设计和编写的最好的通信组件集。它不是免费的,所以不那么出名,但值得研究。
专业版:
精心设计和编写 包含许多components并实现各种协议。 支持广泛的 Delphi 版本(包括 2007 和 XE) SSL 支持 release history 表示的成熟产品缺点:
非开源【讨论】:
【参考方案5】:您可以考虑使用更高级别的协议,例如 HTTP,因为:
它对防火墙和 *** 更友好; 它有据可查,被称为良好的协议; 它已经有安全的 HTTPS 版本; 与行 TCP/IP 相比,它的开销非常低; 它已准备好在 AJAX 环境中使用(如果您将来需要它); Microsoft 已经在现代版本的 Windows 中为您进行了低级调优。在这种情况下,您可以查看从 Delphi 6 到 XE 的 two Open Source classes:
THttpApiServer
使用快速 http.sys 内核模式服务器实现 HTTP 服务器:
TWinHTTP
使用 WinHTTP API 处理客户端 HTTP/1.1 请求:
WinINet
API 快得多。
结果速度非常好(尤其是服务器),您将依赖 Microsoft 实施。第一个是 IIS 的核心,第二个用于最新版本的 Internet Explorer。
【讨论】:
在这种特殊情况下,运行在 TCP/IP 之上的协议需要健壮、轻量并且基于连接(不是基于会话),服务器可以是 Windows 或非 Windows,并且该协议应支持非 Windows 服务器的身份验证。连接终止后,服务器应释放所有后端资源。如果您对好的基础协议有任何建议,请告诉我。 HTTP/1.1 可以是基于连接的 AFAIK - 您只需要保持连接处于活动状态 - 并支持非 Windows 服务器或客户端的身份验证。但它最好面向无状态架构,例如 REST。【参考方案6】:答案实际上取决于许多因素和您的要求,例如
-
需要哪些层(TCP、SSL/TLS、应用级协议)
您是否还需要客户端或服务器(服务器是更复杂的任务)
您是否计算付费选项。
一般来说,在 18 个月甚至 3 年内发生的事情并不多(积极的),因为大多数开发人员将 .NET 视为主要开发平台。
Clever Internet Suite 在其他答案中提到,DevArt's SecureBridge 获得了一些新功能。
我们的SecureBlackbox 支持***的功能(除了本机 SSL/TLS):IPv6、具有基本、摘要和 NTLM 身份验证的 HTTPS 代理(从 SecureBlackbox 9 开始)、国际域名(从 SecureBlackbox 9 开始)、 DNSSEC、带宽控制等。
SecureBlackbox 支持的应用级协议有 HTTP(客户端和服务器)、WebDAV(客户端和服务器)、FTP(客户端和服务器)、SSH 和 SFTP(客户端和服务器)、SMTP 和 POP3 客户端、DNS 客户端、AS2和 AS3。所有协议(当然除了 SSH 和 SFTP)都完全支持 SSL/TLS。
支持的协议列表可以在Packages 页面上找到。每个包的技术规范页面上列出了支持的协议功能。
【讨论】:
从 SBB 的包中,不清楚是否支持除安全相关协议之外的其他协议(HHTP、POP3、TELNET、DNS 等等)? eldos.com/sbb/packages.php @Jeroen HTTP、FTP 和 SMTP 可用,WebDAV 和 POP3 在版本 9(现在处于公开测试阶段)中可用,DNS 与 DNSSEC 一起可用。尽管如此,仅仅比较协议的数量(与其他产品或与一个人的期望)并不完全正确,因为相同协议的实现可能在支持的功能上存在显着差异。 我理解你的意思,这实际上是 Indy 中最耗时的事情之一:找出协议的哪些部分是/不支持的;是否有文档 SBB 支持哪些协议以及这些协议的哪些覆盖范围? @Jeroen 这是个好问题:)。我们全面实施协议。不幸的是,没有一个地方可以查看所有组件/功能的列表,但是有一个分组到包中的组件列表(eldos.com/sbb/packages.php)和每个包的功能列表(请参阅每个包的技术规范部分)。帮助文件还列出了所有组件的所有方法和属性,因此通过浏览列表可以找到所需的功能。 谢谢 :) 您能否通过一些相关链接更新您的答案,尤其是文档?然后我们可以放弃一些 cmets。【参考方案7】:在旧的 Delphi 版本(2!3!4!)中使用 NetMaster 组件方式(方式!)
曾与 Indy 合作过,但也有不自然的感觉(实际上我更倾向于将其描述为笨重)
当我在搜索 Windows 网络 API 的轻量级包装器时,偶然发现了 Synapse,
然后重新发现了普通的旧 TTcpClient/TTcpServer。它们是德尔福自己的 winsock 包装器!我使用它们阻塞,为每个 TTcpClient 使用一个专用的 TThread 继承者,让 TTcpServer 执行线程并完成 DoAccept 中的所有工作,例如,请参阅here。
现在,这给了我我们正在寻找的坚如磐石的感觉。如果你想支持重负载,我会尝试构建一个线程管理器来处理每个线程的多个套接字/连接,或者有两组线程:一些侦听大量“休眠”连接,其他处理较少的“活动”连接,根据是否正在处理请求或响应来切换线程之间的连接。 (例如 HTTP 的 Connection: keep-alive
)
【讨论】:
据我记忆,TTCPClient/TTCPServer 的实现存在一些问题。看看 Remy 在forums.embarcadero.com/thread.jspa?threadID=44767“TTcpClient(和 TTcpServer)是一个可怕的编写组件。这是 Borland 对 CLX 框架的跨平台套接字解决方案的尝试,但他们以最不常见的恶魔方式编写了它。几乎没有有用的功能。我强烈建议你完全停止使用它,要么使用旧版 VCL TClientSocket 组件,要么切换到第三方套接字库,例如 Indy、ICS 或 Synapse。"以上是关于Wiki:Delphi 第 3 方 TCP/IP 组件库的最新技术的主要内容,如果未能解决你的问题,请参考以下文章
自动启用命名管道和 TCP/IP 协议 SQL Server 2008 R2