Java和C++进程之间的通信[重复]

Posted

技术标签:

【中文标题】Java和C++进程之间的通信[重复]【英文标题】:Communication between Java and C++ process [duplicate] 【发布时间】:2013-01-23 18:28:49 【问题描述】:

可能重复:Inter-process communication between languages/operating systems

我需要在 java 和 C++ 进程之间进行进程间通信,因为它们是不同的进程,所以我不能使用 JNI。我正在考虑使用套接字通信,但是除了套接字通信之外还有其他解决方案吗?哪个更好更快?

【问题讨论】:

标准输入输出呢?其他可能性:命名管道、共享内存和像 DBus 这样的 IPC 系统。但我也喜欢你提到的关于套接字的解决方案;它们的可移植性成为远程连接有时是最重要的优势。 套接字可能是最简单的,具体取决于您要执行的操作。如果您衡量了性能问题,请从您能想到的最简单的开始并对其进行优化。 我没有在java中使用gud手,可以在C++和java进程之间使用管道或共享内存或消息队列。感谢任何输入。 我不必这样做,因为它在同一台机器上 - 同一台机器上的 UDP非常可靠 @user1808932 你可以通过附加一个有效载荷来获取订单数据包,以保持数字 【参考方案1】:

一般来说,您有以下几种可能性(可能还有更多,但这些是“流行”的):

标准输入和输出通道。 (+) 易于实现 (+) 快速 (+) 易于调试 (-) 您无法附加/分离到/从已经正在运行的进程

命名管道。 (+) 快速 (-) 系统相关

IPC 系统,例如 DBus。 (-) 系统相关

TCP 套接字通信。 (-) 较慢,但应该足够快 (+) 可以轻松扩展到远程通信 (+) 易于调试 (-) 可能的 TCP 端口应用程序或同一应用程序的实例之间的冲突。

就个人而言,我更喜欢 TCP 套接字通信,因为可以在(几乎)没有源代码更改的情况下建立远程连接。但是,必须注意不要在同一台机器上两次使用相同的端口,这是不可能的。正如您可能已经知道的那样,第二个实例将无法侦听端口。一种可能的解决方法是使用端口范围。

【讨论】:

@doc 我对此知之甚少。你想在我的答案中添加它/输入你自己的答案吗? 如果两个进程在同一台机器上,他也可以使用共享内存。几乎可以肯定是最快的,但它可能需要 Java 端的一些 JNI,并且绝对依赖于系统。 @JamesKanze 我不确定 JVM 是否可以轻松访问 Java 进程的共享内存。 @doc JVM 没有。这就是您需要 JNI 的原因——在 C 或 C++ 中获取共享内存。您仍然需要将 Java 数据复制到共享内存中或从共享内存中复制出来,但是进程内复制仍然比任何其他方法都要快得多。 @james : 你能详细说明一下吗,我喜欢在 java 和 C++ 进程之间实现共享内存。【参考方案2】:

您看过ZeroMQ 还是更吸引我的Cros-s-roads I/O?

【讨论】:

【参考方案3】:

有很多可用的 IPC 方法,选择哪一种真正取决于您想要做什么

    文件:可能是最容易实现的一种,只有您需要注意同步、脏读等。 信号:我只能说很少,但它应该是快速的通信方法,我相信它实现起来更复杂 网络:我最喜欢的方法,每个新进程/节点都会在 spwan 上打开一个新端口,更好的选择是使用与ros nodelets 类似的机制,它会在一个进程中触发许多“nodelet”。这是一种快速的方法,但不是实时的

除了你有信号量、共享内存和管道等。 但是这些都不容易理解和实现,虽然我相信应该有一些库,在操作系统级别也是如此

【讨论】:

以上是关于Java和C++进程之间的通信[重复]的主要内容,如果未能解决你的问题,请参考以下文章

进程间通信的问题(C++高手进)

C++ 和 Java 对象通信

Java 应用程序和 C++ 应用程序之间的通信

C++和Objective C之间通信的IPC机制

Java 和 .NET 3.5 之间进程间通信的最佳方法是啥?

在 C 中的进程间通信中传递结构