Java与C+之间的通信+;过程
可能重复:Java与C+之间的通信+;过程,java,c++,ipc,Java,C++,Ipc,可能重复: 我需要在java和C++进程之间进行进程间通信,因为这两个进程都是不同的进程,所以我不能使用JNI。我正在考虑使用套接字通信,但是除了套接字通信之外还有其他解决方案吗?哪个更好更快?你有没有看过哪个对我更有吸引力?一般来说,你有以下几种可能性(可能会有更多,但这些是“受欢迎的”可能性): 标准输入和输出通道。(+)易于实现(+)快速(+)易于调试(-)您无法连接/分离到已经运行的进程 命名管道。(+)快速(-)系统相关 IPC系统,例如DBU。(-)系统相关 TCP套接字通信。(
我需要在java和C++进程之间进行进程间通信,因为这两个进程都是不同的进程,所以我不能使用JNI。我正在考虑使用套接字通信,但是除了套接字通信之外还有其他解决方案吗?哪个更好更快?你有没有看过哪个对我更有吸引力?一般来说,你有以下几种可能性(可能会有更多,但这些是“受欢迎的”可能性):
- 标准输入和输出通道。(+)易于实现(+)快速(+)易于调试(-)您无法连接/分离到已经运行的进程
- 命名管道。(+)快速(-)系统相关
- IPC系统,例如DBU。(-)系统相关
- TCP套接字通信。()速度较慢,但应足够快(+)可以轻松扩展到远程通信(+)易于调试(-)应用程序或同一应用程序实例之间可能存在的TCP端口冲突
就个人而言,我更喜欢TCP套接字通信,因为它可以在(几乎)不更改源代码的情况下进行远程连接。但是,必须注意不要在同一台机器上使用同一端口两次,这是不可能的。您可能已经知道,第二个实例将无法侦听端口。一种可能的解决方法是使用端口范围。有许多IPC方法可用,选择哪种方法取决于您想要做什么
但是这些都不容易理解和实现,尽管我相信应该有一些库来实现这一点,也在操作系统级别上那么标准输入和输出呢?其他可能性:命名管道、共享内存和类似DBus的IPC系统。但是我也喜欢你提到的关于插座的解决方案;它们的可移植性有时成为远程连接是最重要的优势。套接字可能是最简单的,这取决于您正在尝试做什么。从最简单的角度考虑,如果你已经测量了性能问题,就可以优化它。我不使用java,可以使用C++或java进程之间的管道或共享内存或消息队列。thanxs用于任何输入。我不必这样做,因为它在同一台机器上-同一台机器上的UDP非常有用reliable@user1808932您可以通过附加一个有效负载来获取订单数据包,该有效负载保持number@doc我对那件事了解得还不够。你想把它添加到我的答案中吗?如果两个进程在同一台机器上,他也可以使用共享内存。几乎可以肯定是最快的,但它可能需要一些Java方面的JNI,并且完全依赖于系统。@JamesKanze我不确定JVM是否可以轻松访问Java进程的共享内存。@doc JVM没有。这就是为什么你需要JNI来获取C或C++中的共享内存。你仍然需要将java数据复制到共享内存中,但进程内的拷贝仍然比任何其他方法快很多。@杰姆斯:你能详细说明一下吗?我喜欢在java和C++进程之间实现共享内存一。