【问题标题】:Which Delphi technology to use?使用哪种德尔福技术?
【发布时间】:2011-03-26 18:14:28
【问题描述】:

我有一个用 Delphi 编写的客户端/服务器应用程序。本质上,应用程序所做的只是在服务器应用程序和连接的客户端之间传输 xml 数据流。我目前正在使用 Indy TIdTCPServer 组件。但是服务器端应用程序在我的一些分期付款中不断崩溃。而且调试起来非常困难。所以我想知道是否有一些我应该利用的“架构”来完成所有的 tcp/ip 连接管理和数据库连接池,让我能够专注于业务逻辑。

这里有更多细节:

  • 客户端必须保持“持久”连接。有时服务器必须通知所有连接的客户端并向其发送数据。
  • 客户端正在使用无线网络卡从笔记本电脑进行连接。所以网络“掉线”很常见。
  • 后端数据库是 SqlServer。
  • 一次最多可以同时连接 100 台计算机。 当服务器获得一个新连接(TCPServer.OnConnect)时,我实例化我自己的对象,其中包含它自己的 SqlServer 数据库连接。当 tcp 连接断开时,我会释放这些对象(以及相关的数据库连接)。
  • 客户端应用程序内置了一个 TTimer。他们定期向服务器发送心跳。如果他们“断开”/“丢失”连接,一旦网络恢复,他们就会自动建立新连接。

有人对这里的最佳方法/架构有什么建议吗?
我认为 Indy 组件可以工作,但同时我觉得在管理连接方面我正在“重新发明轮子”。

【问题讨论】:

  • 滚动你自己的意味着投入一定比例的时间来维护你自己的框架。为了提高您在 Delphi 中的有效性,您应该评估已经构建和支持的商业支持技术/工具包/组件的想法非常好。当然开源工具也可以很好。但是,如果您的时间比金钱更稀缺,请选择商业解决方案。
  • 绝对 - 正是我得到的。我只想要一个行之有效的 C/S“3 层”架构。

标签: delphi architecture client-server


【解决方案1】:

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

【讨论】:

  • 非常感谢您的详细解答。我实际上没有COM经验。我的专长几乎仅限于 delphi 组件和 3rd 方工具。
  • 好吧,那就忘了我在这里说的话。 COM(和 COM+)在开始时有很高的学习曲线。但是,一旦您了解了这项技术,它就会非常有用,让您无需任何第三方组件即可使用标准的 Windows 功能!
【解决方案2】:

您可能还想看看 ICS/Midware 组合:http://www.overbyte.be/

【讨论】:

  • 我将不得不回顾 ICS。我确实有这个组件。但据我所知,它是一个“TCP/IP”组件,基本上完成了 Indy/IpWorks 所做的工作。我最终要寻找的是一个集连接管理和数据库池于一体的组件。
  • ICS 相当于 Indy。中间件是用于多层应用程序的不同产品,它恰好使用 ICS 作为通信层。它们是来自同一个人的两种不同的产品。 :-)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    Misha Charrett 的 CSI Application Framework 几乎涵盖了您所要求的内容。

    它是一个开源的 Delphi 框架,其核心是一个分布式消息传递和线程框架,允许 XML 消息从客户端到服务器以及从服务器到客户端传递。

    它可以处理断开/重新连接、高客户端数量,并且有一个可选的虚拟数据库库可以处理 SQL Server(或者您可以使用您现在使用的相同 SQL Server 访问权限)。

    它还不是特别为人所知,但我可以告诉你,它在过去几年里得到了积极的开发,作者 Misha 非常热衷于帮助任何有兴趣在他们的应用程序中使用它的人。

    【讨论】:

    • 谢谢 - 我会检查一下。
    【解决方案5】:

    如果您想要一些轻量级 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 是否自动假定“无状态”?此特定应用程序需要保持持久连接。
    • HTTP/1.1 定义了一个持久连接。在我们的实现中,我们设置了一个“KeepAliveMS”属性(客户端),以在提供的毫秒指定值期间保持连接。从服务器的角度来看,它是无状态的,但连接没有断开。有了这样的持久连接,我在 Windows 下看到了 x10 到 x40 的速度增强。您可以使用 cookie 来提供会话功能。但是由于我们想实现一个 RESTful 框架,所以我们没有使用 cookie,而是一个纯粹的无状态框架。
    【解决方案6】:

    据我所知,三个组件集将为您处理客户端服务器应用程序的基本技术方面:

    您可能需要重新设计您的应用程序以利用这些组件集的工作方式,但假设您有适当分离的层,这应该不会太麻烦,并且会为您带来经过良好测试和广泛使用的优势您的客户端服务器工作的代码。

    【讨论】:

    • +1。我评估了 RemObjects 和 kbmMW,它们非常出色。我还没有评估过 Asta,但它看起来很有希望。
    • Asta 可能不是最佳选择,因为它不再积极开发。
    • @dmauric.mp:谢谢,不知道。再次查看该站点,它看起来确实已经过时了:提到 Asta 3.0 支持 Delphi 版本 7 和主页最后更新 2006 年 1 月 28 日...
    • 立即查看 RemObjects。安装各种 kbmMW 软件包时遇到一些困难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多