【问题标题】:IPC between Java and C applicationsJava 和 C 应用程序之间的 IPC
【发布时间】:2011-05-05 16:09:07
【问题描述】:

我有 2 个应用程序,一个用 C 编写,另一个用 Java 编写,假设在同一台机器上运行。在它们之间实现 IPC 的最佳方式是什么?

最好的意思是可移植性、最小的用户意识(防火墙弹出窗口...)等。

【问题讨论】:

  • 其中很多取决于操作系统 - 例如:Linux 和 Solaris 门。
  • 您可以使用 JNI 或 JNA 来实现一个库,该库将调用 C 函数以使用 IPC。有提供 IPC 的跨平台 C 库。如果你会使用 C++,那么你可以使用 Boost 库,它提供了 IPC。

标签: java c


【解决方案1】:

我会使用 Sockets over loop back 来开始。这允许您发送文本或二进制数据并在一个进程启动或终止时干净地处理。延迟大约为 20-50 微秒,具体取决于您对数据的处理方式以及发送的数量。

套接字独立于平台,可以在纯 Java 中使用。有数百万个适用于 Java 的示例和教程。

【讨论】:

  • 套接字也是我的首选,但我担心用户将面临防火墙弹出窗口。当套接字是“本地的”时会发生这种情况吗?
  • 我确信这是特定于防火墙的。我有 Windows Vista/7,它不会为此弹出窗口。 (也许是第一次,但我早就忘记了;)
【解决方案2】:

我发现最简单的方法是从 java 执行本机程序,然后通过进程输入和输出流进行通信。但这仅适用于 ASCII 通信,在大多数情况下都可以。这种方法适用于跨平台。如果应用程序是独立启动的,那么文件或套接字都是跨平台的方法,如果需要,可以使用二进制数据。

总是有 JNI 或 JNA,但这些通常最适合 Java 和本机代码之间的紧密耦合。

【讨论】:

    【解决方案3】:

    为此,您可以使用命名套接字或网络套接字。

    【讨论】:

      【解决方案4】:

      我从未尝试过,但 Java 确实支持内存映射文件 http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/MappedByteBuffer.html 这将使您能够在 C 和 Java 应用程序之间共享对象。同步访问可能具有挑战性,因为我认为 Java 不能直接访问操作系统级 IPC 同步原语。

      【讨论】:

        猜你喜欢
        • 2011-01-02
        • 2016-03-22
        • 1970-01-01
        • 2010-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多