我已经做了大约18个月的裸机TCP / IP,所以我想知道目前的技术水平是什么。
我正在寻找正面和负面两个方面,开发服务器和客户端软件 我将做一个需要坚如磐石的TCP / IP层的项目,所以对我来说这是一个重要的方面:)
为了成为一个社区维基,我正在寻找更广泛的答案而不仅仅是'坚如磐石'。因此,例如有关特征宽度的信息也很受欢迎。
我将使用答案中的相关方面更新问题,以获得对这些库有均衡概述的wiki条目。
例如,请参阅下面的回答以及我过去与Indy的经历 我对Indy的异常处理和反冻结感到矛盾,虽然我已经习惯了它,但它仍然感觉有点不自然。
现在我用Delphi 2007(非Unicode)和XE(Unicode)开发,所以我考虑的库应该至少支持这两个Delphi版本。
答案 0 :(得分:9)
修改:我过去与Indy的经历总结和评论(感谢Eugene,Marjan) (请使用当前的Indy最新技术进行更新):
临:
缺点:
答案 1 :(得分:5)
ICS - see www.overbyte.be。由FrançoisPiette开源。对我而言,这一直是Indy的第一选择。这是最有趣的卖点:它使得使用异步东西变得容易,而异步似乎更接近于“裸机”套接字编程。
我用它来构建一个相当复杂的VNC代理,代理本身(服务器)是用ICS构建的,客户端是Indy和ICS的混合体。在需求高的时期,代理处理大约100个同时连接和大约10个同时的VNC屏幕会话。它平均消耗5 mbit / s,通过两个不同的Internet连接处理连接。我不认为100 + 10是限制,因为服务器处理没有任何问题,CPU使用率太低,无法提及。
所有这一切,我在很长一段时间内没有使用过ICS,我没有及时了解所有的花里胡哨。这是CW,所以请编辑和扩展!
答案 2 :(得分:2)
我从2003年开始使用Indy作为我自己的TCP通信框架。它是坚如磐石的,我有一个与Delphi 2007一起使用的版本和另一个与Delphi 2010一起使用的版本,如果你正确地处理了threadng,就不需要使用防冻东西了,我在客户端和服务器上有一致的异常处理通过实现我自己的包装器。
您可以在此处下载(http://www.csinnovations.com/framework_delphi.htm) - 查找 Tcp 单元,主要是AppTcpServerUnt和AppTcpClientUnt。
答案 3 :(得分:2)
我强烈推荐Clever Internet Suite,它是迄今为止设计和编写的最佳通信组件集。它不是免费的,所以不是众所周知的,但它值得调查。
临:
缺点:
答案 4 :(得分:2)
答案实际上取决于许多因素和您的要求,例如
总的来说,由于大多数开发人员将.NET视为主要开发平台,因此在18个月甚至3年内发生的事件并不多(积极)。
其他答案中提及的{p> Clever Internet Suite和DevArt's SecureBridge获得了一些新功能。我们的SecureBlackbox支持最高级的功能(除了原生SSL / TLS):IPv6,HTTPS代理,基本,摘要和NTLM身份验证(从SecureBlackbox 9开始),国际域名(从SecureBlackbox 9开始) ),DNSSEC,带宽控制等。
SecureBlackbox支持的应用程序级协议是HTTP(客户端和服务器),WebDAV(客户端和服务器),FTP(客户端和服务器),SSH和SFTP(客户端和服务器),SMTP和POP3客户端,DNS客户端,AS2和AS3。所有协议(当然除了SSH和SFTP之外)都完全支持SSL / TLS。
支持的协议列表可在Packages页面上找到。每个软件包的“技术规范”页面上列出了支持的协议功能。
答案 5 :(得分:2)
您可以考虑使用更高的协议级别,例如HTTP,因为:
在这种情况下,您可以查看从{4}到Delphi 6到XE的工作:
THttpApiServer
使用快速http.sys内核模式服务器实现HTTP服务器:
TWinHTTP
使用WinHTTP API处理客户端HTTP / 1.1请求:
WinINet
API快得多。结果速度非常好(尤其是服务器),您将依赖Microsoft实施。第一个是IIS的核心,第二个是在最新版本的Internet Explorer中使用。
答案 6 :(得分:1)
使用NetMaster组件方式(方式!)返回旧的Delphi版本(2!3!4!)
是否有人与Indy合作过,但也有不自然的感觉(实际上我会把它描述得更笨重)
当我在Windows网络API周围搜索一个轻薄的包装时偶然发现Synapse,
然后重新发现普通的旧TTcpClient / TTcpServer。他们是Delphi自己的winsock包装器!我使用它们阻塞,为每个TTcpClient使用专用的TThread继承,让TTcpServer执行线程并在DoAccept中完成所有工作,请参阅here作为示例。
现在,这让我感受到了我们正在寻找的坚如磐石的感觉。如果你想支持繁重的负载,我会尝试构建一个线程管理器来处理每个线程的几个套接字/连接,或者有两组线程:一些用于监听大量“休眠”连接,另一些用于处理较小的“活动”连接,根据处理请求或响应的情况切换线程之间的连接。 (例如HTTP的Connection: keep-alive
)