选择哪种 Delphi 技术?

5
我有一个使用Delphi编写的客户端/服务器应用程序。 应用程序的主要功能是在服务器应用程序和已连接的客户端之间传输xml数据流。 目前我正在使用Indy TIdTCPServer组件。 但是,服务器端应用程序在某些安装中一直崩溃,并且极难调试。 因此,我想知道是否有一些“架构”可以使用,它可以处理所有tcp / ip连接管理和数据库连接池,使我能够专注于业务逻辑。
以下是更多细节:
- 客户端必须保持“持久”连接。 有时,服务器必须通知并向所有连接的客户端发送数据。 - 客户端通过无线空卡从笔记本电脑连接。 因此,网络“掉线”很常见。 - 后端数据库是SqlServer。 - 可以同时连接超过100台计算机。 - 当服务器获得新连接(TCPServer.OnConnect)时,我实例化了自己的对象,其中包含自己的SqlServer数据库连接。 当tcp连接断开时,我释放这些对象(以及相关的数据库连接)。 - 客户端应用程序内置TTimer。 它们定期向服务器发送心跳。 如果它们“断开”/“失去”连接,则在网络恢复后自动建立新连接。
任何人对这里的最佳方法/架构有什么建议吗? 我认为Indy组件会起作用,但同时感觉我在“重复造轮子”以管理连接。

1
自己开发意味着要花费一定比例的时间来维护自己的框架。为了增强在Delphi中的效果,您认为应该评估已经构建和支持的商业支持技术/工具包/组件的想法是非常好的。当然,开源工具也可能很好。但如果您的时间比金钱更为宝贵,那么请选择商业解决方案。 - Warren P
完全正确 - 这正是我想要的。我只想要一个经过验证的、可行的 C/S "三层" 架构。 - M Schenkel
6个回答

6
我知道有三种组件集可以为您处理客户端服务器应用程序的技术细节:
- kbmMW: http://components4developers.com/ - Asta: http://www.astatech.com/index.asp - RemObjects: http://www.remobjects.com/ 您可能需要重新设计应用程序以利用这些组件集的工作方式,但是假设您已经正确地分离了层,这不会太麻烦,并将为您的客户端服务器工作购买经过充分测试和广泛使用的代码的优势。

1
+1. 我已经评估了RemObjects和kbmMW,它们都非常出色。我还没有评估Asta,但它看起来很有前途。 - Warren P
3
Asta可能不是最佳选择,因为它不再得到积极开发。 - user219760
@dmauric.mp:谢谢,我不知道这个。再看一下网站,它确实看起来相当过时:提到支持Delphi 7版本的Asta 3.0,并且主页上最后更新日期是2006年1月28日... - Marjan Venema
现在去检查 RemObjects。安装各种 kbmMW 软件包时遇到一些困难。 - M Schenkel

1

如果你需要一些轻量级的TCP/IP组件,请看一下我们的SynCrtSock单元。

你会发现一些低级别的类来创建IP客户端和服务器。 我们在其中一个应用程序中实现了TCP/IP和UDP/IP。

还有一个THttpServer类,它实现了一个HTTP/1.1服务器。因此它遵循HTTP/1.1连接管理。还有一个可选的压缩功能,并且在端口80以外使用HTTP/1.1也不是一个坏主意。而HTTP/1.1的好处是可以穿越防火墙,并且可以轻松地通过VPN或托管在另一个HTTP服务器(如IIS或Apache)上使用代理。如果您需要一个基于Linux的解决方案下的这样的服务器,甚至还有一个FastCGI类。 当然,THttpClientSocket类在客户端上执行相同的操作。

我们使用这些类将HTTP/1.1连接添加到我们的开源SQLite3 RESTful框架中 - http://synopse.info/forum/viewforum.php?id=2

请查看http://synopse.info/fossil/artifact?name=722e896e3d7aad1fe217b0e2e7903483e66d66d1获取SynCrtSock单元。该单元为开源项目,适用于Delphi 7至Delphi 2010。


HTTP在客户端建立连接和请求、服务器响应数据以及客户端断开连接的过程中是否自动假定“无状态”?这个特定的应用程序需要维护一个持久连接。 - M Schenkel
HTTP/1.1 定义了持久连接。在我们的实现中,我们设置了一个 "KeepAliveMS" 属性(客户端),以在指定的毫秒数内保持连接。从服务器的角度来看,它是无状态的,但连接并没有断开。通过这样的持久连接,在 Windows 下,我曾经看到了 x10 到 x40 倍的速度提升。您可以使用 cookie 提供会话功能。但由于我们想要实现一个 RESTful 框架,因此我们没有使用 cookie,而是采用纯无状态框架。 - A.Bouchez

1
Misha Charrett的CSI Application Framework几乎涵盖了您所需的所有内容。
它是一个开源的Delphi框架,其核心是分布式消息传递和线程框架,允许客户端和服务器之间以及服务器和客户端之间进行XML消息传递。
它可以处理断开/重新连接、高客户端数量,并且有一个可选的虚拟数据库库,可以处理SQL服务器(或者您现在正在使用的相同的SQL Server访问)。
它目前还不是特别出名,但我可以告诉您,它在过去几年中一直在积极开发,作者Misha非常乐意帮助任何对在他们的应用程序中使用它感兴趣的人。

1

嗯,这可能需要对您的C/S代码进行完全重写,但是您可以尝试使用COM+解决方案而不是使用Indy组件。基本上,您将创建一个安装在服务器上的COM+组件,您的客户端应用程序将连接到此客户端并直接调用此组件的函数。它将具有由Windows自身处理的事务管理,并且处理事务的方式也是如此。从技术上讲,还可以创建事件,这将允许服务器回调客户端,尽管这会使事情变得更加复杂。
我认为这个解决方案对您来说可能行不通,除非您在Windows中具有大量的COM开发经验和/或足够勇敢尝试不同的东西。
过去,我遇到了类似的问题,数百个客户端必须连接到单个服务器,执行各种数据库事务。它具有陡峭的学习曲线,但我和我的团队设法让事情正常运转,一旦我们理解了这种技术,它就成为了一个非常稳定和可靠的解决方案,成功地实现了最多500个用户同时进行更新和其他操作的一次极限压力测试。但是,学习曲线很陡峭,所以它可能不是您正在寻找的解决方案。
(不过,COM+将使用Windows内置的许多功能,如事务管理、数据库池等等。)


1
非常感谢您详细的回答。事实上,我没有COM经验。我的专业知识基本上仅限于Delphi组件和第三方工具。 - M Schenkel
那么,就忘记我在这里说的话吧。COM(和COM+)一开始的学习曲线很高。但一旦你理解了技术,它可以非常有用,让你使用标准的Windows功能而无需任何第三方组件! - Wim ten Brink

0

如果您使用Indy,每个连接将等同于一个线程。

无论如何,我建议连接到MSSQL时使用Devart的SDAC http://www.devart.com/sdac/,并且在连接层上使用基于I/O完成端口的HPScktSrvr来自http://www.torry.net/authorsmore.php?id=7131(不过我不知道它需要哪些更改以适应新版本的VCL中的TThread更改)。 您可以构建围绕THPServerClient的客户端类,将您的新类设置为服务器ClientClass,框架将自动为您创建新客户端。


0

我需要回顾一下ICS。实际上,我有这个组件。但据我所知,它是一个“TCP/IP”组件,基本上可以做Indy/IpWorks所做的事情。我最终要找的是一个组件,可以同时进行连接管理和数据库池化。 - M Schenkel
1
ICS是Indy的等价物。Midware是一种不同的多层应用程序产品,恰好使用ICS作为通信层。它们是来自同一人的两个单独的产品。 :-) - Ken White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接