Java和C++进程之间的通信

3

可能是重复问题:
不同语言/操作系统之间的进程间通信

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


3
标准输入输出怎么样?其他可能性:命名管道、共享内存和像DBus这样的IPC系统。但我也喜欢你提到的套接字解决方案;它们的可移植性使其成为远程连接的最重要优势。 - leemes
1
套接字可能是最简单的,这取决于你想做什么。从你能想到的最简单的开始,如果你测量出性能问题,再进行优化。 - Peter Lawrey
我在Java方面不是很擅长,是否可以在C++和Java进程之间使用管道、共享内存或消息队列。感谢任何建议。 - user1808932
1
我不需要这样做,因为它在同一台机器上 - 在同一台机器上使用UDP非常可靠。 - Aniket Inge
1
@user1808932,您可以通过附加一个保留编号的有效负载来获取订单数据包。 - Aniket Inge
显示剩余7条评论
3个回答

7
一般来说,您有以下几种选择(可能还有更多,但这些是“流行”的选择):
  • 标准输入和输出通道。 (+)易于实现 (+)快速 (+)易于调试 (-)无法附加/分离到/从已运行的进程

  • 命名管道。 (+)快速 (-)依赖于系统

  • IPC 系统,例如 DBus。 (-)依赖于系统

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

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

@doc 我对此不了解足够多。你想在我的回答中添加它/提供你自己的回答吗? - leemes
如果两个进程在同一台机器上,他还可以使用共享内存。这几乎肯定是最快的方法,但可能需要在Java端使用JNI,并且明显依赖于系统。 - James Kanze
@JamesKanze 我不确定JVM是否为Java进程提供了轻松访问共享内存的方式。 - mip
@doc JVM不支持访问共享内存,因此您需要使用JNI来在C或C++中访问共享内存。您仍然需要将Java数据复制到共享内存中或从共享内存中复制出来,但是进程内复制仍然比其他方法快得多。 - James Kanze
@james:你能再详细解释一下吗?我想实现Java和C++进程之间的共享内存。 - user1808932
@user1808932 你需要在C或C++中实际访问共享内存,并通过JNI与Java通信。除此之外,如何访问共享内存非常依赖于系统:函数有mmapmunmap;在Windows下,你需要使用CreateFileMappingMapViewOfFileUnmapViewOfFile - James Kanze

0

0

有许多IPC方法可供选择,选择哪种方法取决于您想要做什么。

  1. 文件:可能是最容易实现的方法,只需关注同步、脏读等问题。
  2. 信号:我对它了解很少,但据说它是一种快速通信方法,我认为它更难实现。
  3. 网络:我最喜欢的方法,每个新进程/节点在生成时打开一个新端口,更好的选择是使用类似于ros nodelets的机制,在一个进程内启动多个“nodelets”。这是一种快速的方法,但不是实时的。

除此之外,还有信号量、共享内存和管道等方法。但这些方法都不容易理解和实现,尽管我相信应该有一些库可以用于此,也可以在操作系统层面上实现。


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