本地C++和Java程序之间通信的好方法有哪些替代方案?

10

在这里,“本地”指的是在同一子网中运行,大多数情况下是在同一主机/虚拟机上运行,因此一些标准的跨网络跨平台RPC机制,如SOAP、XML-RPC、CORBA等似乎是不必要的。

有效负载主要是从C++到Java的数值数据(主要是表格形式)和少量元数据(例如可用数据服务、数据描述/类型等),以及从Java到C++的控制台/脚本化UI事件。因此,C++程序充当服务器,Java程序充当客户端。

我可以列举出几个选项(大多数是从搜索这个精彩的网站得来的),但我从未在真实的重型环境中使用过或看到过其中任何一个,所以我真的希望那些“曾经在那里,做过那个”的人能够教育我各种选项的利弊。

  1. 共享内存
  2. 管道、stdin/stdout等
  3. 通过普通套接字(可能是UDP)发送自定义数据结构(这个问题
  4. 通过普通套接字发送消息,可以是Google协议缓冲、Thrift、JSON等(这个答案,以及其他答案)
  5. Java RMI与C++ RMI服务器(这个问题
  6. JNI(在这个问题中有一些答案)

我非常确定有很多选项我没有列举出来。感谢大家的帮助!


编辑:我忘了提到性能不是主要关注点,因为数据吞吐量不会很大(服务器受到数据库绑定),但知道哪种选项比其他选项更快或更慢是很重要的。例如,我认为没有什么比共享内存更好(如果做得正确)。

2个回答

4

选项3和选项4在实际的重型场景中被使用。

选项1、2、6无法到达另一个主机。

选项5对于非Java方面来说可能会过于麻烦。

我会选择选项4,因为选项3太低级了(除非选项4被证明太慢)。从你列举的跨平台轻量级消息传递协议中选择你最喜欢的。它们都经过“大浪淘沙”的考验,并且有大多数语言的库。


谢谢!正如我所说,这两个程序很可能在同一主机上,因此如果您能详细说明同一主机选项,我将不胜感激。关于消息协议,我知道每种协议都有其优缺点,但您是否有自己偏爱的协议呢? - std_colon-colon_ex
1
对于同一主机之间的通讯,我仍然会首选选项4到本地主机,只有在这种情况过慢时才考虑使其更加复杂。 - Thilo

1
我会选择第四个选项。我会跳过第五个选项。第二个选项会很笨重。
我们讨论的是将数字作为纯文本传递,对吗?

不,为什么呢?我肯定想利用protobuf的varint,比如说。 - std_colon-colon_ex
传递纯文本更容易调试和处理,因为它消除了任何奇怪的二进制格式问题。当然,文本比二进制大得多,但是你说你的交易率将相对较低。如果可能的话,我会传递文本,并只在必要时回退到二进制。 - Tony Ennis
使用已经建立的线格式(如protobuf),奇怪的二进制格式问题不应该成为问题。 - Thilo

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