用不同语言编写的应用程序之间的通信

Posted

技术标签:

【中文标题】用不同语言编写的应用程序之间的通信【英文标题】:Communication between applications written in different languages 【发布时间】:2010-12-03 19:52:37 【问题描述】:

我正在考虑将几个应用程序链接在一起(全部用不同的语言编写,如 C#、C++、Python),但我不知道该怎么做。

链接是什么意思?我正在研究的系统由小程序组成,每个小程序负责特定的处理任务。我需要能够轻松地将数据集从一个应用程序传输到另一个应用程序(所讨论的数据集并不大,可能只有几兆字节)并且我还需要某种形式的方法来控制操作的当前状态(这是客户端-服务器模型敲响警钟)

似乎套接字或 SOAP 可能是一种通用解决方案,但只是想了解人们对这个主题的看法。

评论/建议将不胜感激,谢谢!

【问题讨论】:

【参考方案1】:

我个人喜欢ØMQ。它是一个库,具有用于传递消息的熟悉的类似 BSD 套接字的接口,但您会发现它实现了用于分配任务的有趣模式。

听起来您想在管道中安排多个进程。 ØMQ 允许您使用推送和轮询套接字来做到这一点。 (之后,您会发现甚至可以毫不费力地跨多个进程和机器进行扩展。)请查看guide 以开始使用,以及专门了解推拉如何工作的zmq_socket(3) 手册页。

绑定适用于您提到的所有语言。

至于消息的内容,ØMQ 并不关心,它们只是原始数据块。您可以使用任何适合您的格式,例如 JSON,或者Protocol Buffers。

我不确定的是你提到的“控制状态”。例如,您是否对中途取消工作感兴趣?

【讨论】:

感谢您的建议,这看起来很有趣!流水线本质上是我正在做的事情,尽管我将不得不处理将数据分叉到多个子应用程序中并等待它们完成处理,然后才能进入下一个阶段,这就是我需要某种状态检查的地方. (我猜这几乎就像通过不同进程运行数据的伪并发一样) 每个子应用负责将任务推送到下一个阶段。表示整个管道完成的一种方法是使用 pub-sub 套接字,并让链中的最后一个子应用程序发布某种通知。 (例如,多个进程可能使用推送套接字将作业提交到管道的开头,并且每个进程都订阅完成通知,等待它们的作业 ID 到来。)如果我没记错的话,mongrel2 就是这样做的,见:igvita.com/2010/09/03/zeromq-modern-fast-networking-stack 这听起来和我想要完成的很相似,看起来我本周的阅读材料已经整理好了。非常感谢您的建议!【参考方案2】:

对于 C# 到 C#,您可以使用 Windows Communication Foundation。您也许可以将它与 Python 和 C++ 一起使用。

您可能还想签出命名管道。

【讨论】:

WCF 看起来很有趣,尽管我可能必须集成一些它可能不支持的其他语言。感谢您的建议。【参考方案3】:

我会考虑转移到一个模型,通过集中所有应用程序查看的数据来消除问题。可以这么说,保持“真理的一个来源”。

【讨论】:

不幸的是,这超出了我的控制范围,我同意单一语言方法会让我的生活更轻松 :) 不一定是单数语言,只要是单数数据。【参考方案4】:

大多数外部软件在链接 C++ 代码时遇到问题,这是由于它对其符号使用名称修饰算法。因此,在与用其他语言编写的程序交互时,通常最好将包装器声明为 extern "C" 或在 extern "C" 块内。

【讨论】:

【参考方案5】:

我需要能够轻松地将数据集从一个应用程序传输到另一个应用程序(所讨论的数据集并不大,可能只有几兆字节)

使用文件系统。

而且我还需要某种形式的方法来控制操作的当前状态

再次,使用文件系统。带有 JSON 序列化对象的“current_state.json”文件非常适合多种语言使用。

似乎套接字或 SOAP 可能是一种通用解决方案。

也许吧。但对于这种事情来说,它是矫枉过正的。您的操作系统已经拥有您需要的所有功能。只需使用文件系统。它非常简单且非常可靠。

【讨论】:

感谢您的建议,我当然考虑过文件系统方法,但认为使用结构化协议(如 SOAP)可能更容易将数据和控制消息组合在一起。 “更容易”?怎么会这样?在比文件系统“更容易”的问题中提供一些示例。我对可能比普通目录中的普通文件更简单的东西画了一个空白。也许我错过了什么。 我同意没有什么比从文件中写入/读取更简单的了,我指的是维护一组连贯的数据/控制消息一起流经系统(可能会出现结构化协议更方便)。我猜你建议的保存 json 文件以跟踪正在发生的事情的方法并不是真正的问题。另一件值得考虑的有趣事情是使用文件系统与套接字实现的该系统的性能。我可能需要做一些简单的比较。 @Hamza:“流经系统的数据/控制消息”。这是什么意思? “我正在开发的系统由小程序组成,每个小程序负责特定的处理任务”听起来像普通的操作系统进程管理。当你有小而简单的程序时,为什么会有消息“流经系统”。如果可以避免,请不要过度发明。更简单总是更快、更便宜且更易于维护。您的要求似乎很简单。除非您的问题不完整。 我想我只是不擅长解释要求,但点了,谢谢:)【参考方案6】:

有很多方法可以进行进程间通信。正如您所说,套接字可能是一种通用解决方案。我认为 SOAP 有点矫枉过正。您也可以使用邮槽。几年前,我使用它编写了 C++ 应用程序。命名管道也可能是一种解决方案,但如果您在 Windows 上进行编码,则可能会很困难。

在我看来:

    套接字 邮槽

是最佳人选。

【讨论】:

谢谢,我必须承认我以前没有听说过邮槽,所以我现在就去看看。

以上是关于用不同语言编写的应用程序之间的通信的主要内容,如果未能解决你的问题,请参考以下文章

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

在 .NET 语言之间共享类方法

VB编写与USB采集卡通信程序

在不同语言的进程之间有效地共享数据

求用keilc编写一串口通信程序

C语言编写串口通信程序在裸机下运行