4

请在标记为重复之前阅读。

我正在创建一组依赖智能卡进行身份验证的应用程序。到目前为止,每个应用程序都单独控制了智能卡读卡器。几周后,我的一些客户将同时使用多个应用程序。因此,我认为创建一个控制身份验证过程的服务应用程序可能会更实用。我希望我的桌面应用程序告诉服务应用程序他们对身份验证过程感兴趣,然后服务应用程序将为他们提供有关当前用户的信息。这部分很简单,使用named pipes. 困难的部分是,服务如何告诉桌面应用程序发生了事件(UserLogIn, UserLogOut, PermissionsChanged, ... 仅举几例)。到目前为止,我有两种方法。CallBack功能,和Messages. 有没有人有更好的主意?我确定有人有。

4

3 回答 3

9

你想用 Delphi 做 IPC(进程间通信)。

有许多链接可以帮助您,Cromis IPC只是一个让您了解您所追求的东西的链接。

与您类似的 SO 问题在这里

如果你想去纯 Windows API,那么看看OutputDebugString 通信是如何实现的
一些工具可以监听该机制,并且许多应用程序可以向它发送信息。

搜索DBWIN_DATA_READYDbWin32以获取有关OutputDebugString协议如何工作的更多信息。

都是很好的阅读。

于 2012-09-05T10:52:04.430 回答
5

当它进入 IPC 时,一些提示:

  • 不要拘泥于一种协议:例如,如果您实现了命名管道通信,您以后可能需要通过网络甚至 HTTP 运行它;
  • 不要重新发明轮子,也不要使用专有消息,而是使用标准格式(如 XML / JSON / BSON);
  • 回调事件有点难以实现,因为常见的模式可能是为每个桌面客户端实现一个服务器,以接收来自服务器的通知。

我的建议是不要使用回调,而是在桌面应用程序上轮询状态架构。您打开与服务器的通信通道,然后每隔一秒/半秒(TTimer在您的 UI 中使用 a),您发出一个小请求,询问发生了什么变化(您可以输入修订号或上次检索的时间戳)。因此,您将桌面数据与未决事件同步。在现有连接上请求更新非常快,如果没有任何变化,只会在网络上来回发送一个 IP 数据包。这是一项非常小的任务,不会减慢客户端和服务器的速度(如果您使用一些内存缓存)。

在实际应用中,从最终用户的角度来看,这种无状态架构响应速度非常快,并且更易于部署。您不需要在每个桌面应用程序上创建服务器,因此您不必打开防火墙端口等。由于 HTTP 是无状态的,因此它甚至对 Internet 友好。

如果你想开发服务,你可以使用DataSnap,比如RemObjects或者你可以试试我们的开源 mORmot 框架,它能够创建基于接口的服务,通过 REST 使用轻 JSON 消息,或者在进程中,使用 GDI 消息,命名为管道或 TCP/HTTP - 免费,具有无与伦比的性能,内置安全性,从 Delphi 6 到 XE2。对于基于事件的任务,只需使用mORMot中提供的客户端-服务器 ORM可能就足够了:创建一个存储事件的表/类(您甚至可以定义一个循环的内存存储 - 无需在此处使用 SQLite3 引擎或数据库),然后询问自上次刷新以来的所有未决事件。服务器可以安全地作为后台服务或普通应用程序 - 一些mORMot用户甚至拥有相同的可执行文件,可以作为独立应用程序、服务器服务、应用程序服务器或 UI 客户端,只需更改配置。

编辑/公告:

mORMot 路线图上,我们添加了一项即将推出的新功能,以轻松实现来自服务器的单向回调。

也就是说,在我们的面向服务架构框架中添加透明的“推送”模式。目的是实现从服务器端触发的通知事件,很容易从 Delphi 代码通过一些interface定义,甚至通过单个 HTTP 连接 - 例如,WCF 不允许这样做:它需要双重绑定,因此需要打开防火墙端口等。

它将通过发布/订阅模式用于简单的事件协作,并允许事件溯源。我将尝试让它实现两种模式:轮询和锁定等待。直接回答你的问题。

于 2012-09-05T11:40:21.873 回答
0

您可以使用简单的 TCP 套接字连接(双向)来允许异步服务器到同一套接字上的客户端消息。

一个例子是 Indy TIdTelnetClient 类,它使用一个线程来处理来自服务器的传入消息。

您可以构建一个类似的基于文本的协议,并且只需要服务中的一个 Indy TCP 服务器实例和应用程序中的一个 Indy Client 实例。

于 2012-09-05T11:39:55.500 回答