【问题标题】:What are the good alternatives for communication between local C++ and Java programs?本地 C++ 和 Java 程序之间的通信有哪些好的替代方案?
【发布时间】:2011-04-24 02:14:18
【问题描述】:

我所说的“本地”是指两者都在同一个子网中运行,在大多数情况下是同一个主机/VM,因此一些标准的跨网络跨平台 RPC 机制(如 SOAP、XML-RPC、CORBA 等)似乎是不必要的。

有效负载主要是数字(主要是表格)数据,带有一些从 C++ 到 Java 的少量元数据(例如可用的数据服务、数据描述/类型等),以及从 Java 到 C++ 的控制台/脚本 UI 事件.因此,C++ 程序就像服务器一样,Java 程序就像客户端一样。

我可以列举几个选项(主要来自搜索这个精彩的网站),但我从未在现实世界的重载情况下使用或见过一个选项,所以我真的希望“去过那里,做过那个”的人可以教育我谈谈这些选项的优缺点。

  1. 共享内存
  2. 管道、标准输入/标准输出等
  3. 普通套接字(可能是 UDP)上的自定义数据结构 (this question)
  4. 普通套接字上的消息,可以是 Google 协议缓冲区、Thrift、JSON 等(this answer 等)
  5. 带有 C++ RMI 服务器的 Java RMI (this question)
  6. JNI(this question 中的一些答案)

我很确定我错过了很多选择。谢谢大家的帮助!


已编辑:我忘了提到性能不是主要问题,因为预计数据吞吐量不会很大(服务器严重依赖数据库),但重要的是要知道一个选项是否突出更快或更慢。例如,我想没有什么比共享内存更好的了(如果做得对的话)。

【问题讨论】:

    标签: java c++ sockets communication rpc


    【解决方案1】:

    我会选择选项 4。我会跳过 5。2 会很笨重。

    我们说的是把数字作为纯文本传递,是吗?

    【讨论】:

    • 不,为什么?例如,我当然想利用 protobuf 的 varint。
    • 传递纯文本更容易调试和处理,因为它消除了任何奇怪的二进制格式问题。文本当然比二进制大得多,但你说你的交易率会相对较低。我会传递我可以的文本,并且只有在必要时才回退到二进制。
    • 在使用 protobuf 等既定的有线格式时,奇怪的二进制格式问题不应该成为问题。
    【解决方案2】:

    选项 3 和 4 用于现实世界的重载情况。

    选项 1、2、6 无法到达其他主机。

    选项 5 对于非 Java 端来说可能太麻烦了。

    我会选择选项 4,因为选项 3 太低级(除非选项 4 太慢)。从您列举的那些中选择您最喜欢的跨平台轻量级消息传递协议。这些都是经过“实战测试”的,并且拥有适用于大多数语言的库。

    【讨论】:

    • 谢谢!正如我所说,这两个程序很可能位于同一主机上,因此如果您也能详细说明同一主机选项,我将不胜感激。关于消息传递协议,我知道每个都有优点和缺点,但你有自己喜欢的吗?
    • 至于同主机通信,我还是会先使用选项 4 到 localhost,如果太慢了才考虑让它变得更复杂。
    猜你喜欢
    • 2012-02-20
    • 2011-11-09
    • 2011-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    相关资源
    最近更新 更多