如何跨语言在多个应用程序之间建立通信

Posted

技术标签:

【中文标题】如何跨语言在多个应用程序之间建立通信【英文标题】:How do I establish communication between multiple applications across languages 【发布时间】:2013-06-03 19:24:32 【问题描述】:

我目前正在运行两个与同一操作相关的程序。程序 A(用 vb6 编写)是一种“控制器”,它打开设备并启动程序 B(用 C++ 编写),开始收集设备数据。现在,程序 B 需要一种方法将一些 MINOR 数据报告回程序 A。程序 A 还需要监视某些额外的数据,如果信号 1 触发,它需要让程序 B 知道。建立这种沟通的最佳方式是什么?显而易见的方法是每个程序读取和写入的文本/二进制文件(没有最好的方法),而且我还考虑使用 UDP 进行通信,因为机器将在封闭的网络上。但是,我不确定我应该如何实际执行此操作?

【问题讨论】:

最好的方法是一些数据库(根据要求选择),定义语法(SQL)来访问数据。 但是如何使用数据库触发和同步呢?大多数不提供任何形式的异步更新通知,迫使您在程序中进行一些讨厌的轮询。 我同意鲍勃的观点。 DB 不适合通信要求,并且可能会超过杀戮,因为所需的通信是基本信号。 【参考方案1】:

命名管道是一个优雅的解决方案,但您甚至可以按照您所说的那样使用文件。

http://support.microsoft.com/kb/177696

How to work with named pipes (C++ server , C# client)

【讨论】:

对此进行调查。如果我最终确定这是解决方案,将标记。【参考方案2】:

还有其他选择: 剪贴板、COM、数据复制、DDE、文件映射、邮槽、管道、RPC、Windows Sockets

参考这里:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365574%28v=vs.85%29.aspx

【讨论】:

您也可以使用 MSMQ。私有机器队列易于创建、销毁和使用。 无论您选择什么,请确保在程序崩溃/结束时释放资源。我确信命名管道在崩溃时肯定会被释放。 如果程序 A 运行程序 B,那么也可以使用匿名管道。任何一种管道、Malslots 等的大问题是 VB6 程序缺乏干净的异步实现。这意味着忙等待循环或计时器驱动的轮询,它可以工作但不是那么优雅。【参考方案3】:

您如何打开设备并启动程序 B?

我会使用相同的频道进行额外的通信,因为这条线路已经在那里并且正在工作(因为程序 B 已经启动)

【讨论】:

程序 A 只是简单地关闭程序 B。目前没有建立通信线路。 啊,由于程序 A 启动了一个设备,我认为程序 B 正在该设备上运行……如果它是一个简单的 shell,那么所有通道都可以工作 :)【参考方案4】:

我个人会选择使用标准协议(如 FTP 或 HTTP)建立通信并传输数据。这样,当您的程序 A 或程序 B 发生变化(或连接介质被换成另一个)时,您仍然可以拥有一个定义明确且易于实现的通信协议。网络堆栈可用于各种 CPU 和操作系统,并且 FTP(或 TFTP)易于实施。

【讨论】:

我看不出这两种方法是如何工作的。两个程序都需要发送消息并通知另一个程序。充其量这两个程序都必须同时实现客户端和服务器,因为它们是“单向”协议。 HTTP 对于这个问题可能是矫枉过正。顾名思义,TFTP 可能是一个不错的选择,而且实施起来很简单。或者也许使用 TFTP 从设备下载大量数据负载,并通过 UDP 使用单独的自定义协议来进行简单的信令。 我不是在程序之间传输文件,而且两个程序都在同一台 PC 上,所以我觉得 TFTP 和 HTTP 都过大了,因为我最多可能会发送 50 个字符。感谢您的想法 哦。你说你有另一个设备来运行程序。在这种情况下是的,管道/套接字应该可以。

以上是关于如何跨语言在多个应用程序之间建立通信的主要内容,如果未能解决你的问题,请参考以下文章

AppDomains之间如何最好地进行通信?

WebService学习总结——WebService相关概念介绍

webservice学习总结-- WebService相关概念介绍

如何跨应用程序在多个 Datagridviews 之间共享 DataTable 并节省宝贵的内存

使用 MVVM,如何在低级服务和视图模型之间建立通信线路?

什么是Web Service