对于以下情况,实现 C++/Java IPC 的最佳方法是什么?
(最近有人问类似的问题 https://stackoverflow.com/questions/5900887/ipc-between-java-and-c-applications,但我的要求更具体)
我有两个程序——一个用 C++ 编写,另一个用 Java 编写——需要相互通信。两者都在同一台机器上运行。
程序相互发送消息。消息通常很短(少于几百字节),但大小可能为 100KB 或更大。
消息不需要确认(即不是像 HTTP 那样的请求/响应模型)。例如,C++ 程序向 Java 程序发送消息,Java 程序可以稍后通过向 C++ 程序发送消息来进行回复,反之亦然。
理想的解决方案将具有 a) 非常低的延迟,b) 没有安全麻烦(用户不必授权打开端口等),c) 与平台无关。
我的第一个想法是使用sockets-- 每个程序都充当另一个程序的服务器。套接字比其他形式的 IPC 具有更多的开销,并且如果我让系统自动分配端口号,我不知道服务器将如何通知客户端端口号。我也考虑过命名管道,但不同平台不支持(至少不一致)。JNI看起来像是一个选项,但它可以跨越流程边界吗?
有什么建议么?
谢谢!
后续问题
- 如果我使用套接字,我需要打开two套接字允许如上所述的异步通信?
我建议你使用TCP 套接字.
根据我的经验,与应用程序的其他任务工作负载相比,TCP 套接字的实际开销非常非常低,至少是我用来开发的应用程序。我的意思是,有时即使套接字的延迟是其他 IPC 机制延迟的两倍,在整个工作流程中它们的影响也很小。它省去了在 Java 应用程序和 C++ 应用程序之间进行 IPC 的麻烦,这最终会要求您使用使用 JNI 的特定 Java 库,以及 JNI 和库本身的开销。
我实际上在我的 Java 应用程序中测量到,垃圾收集器的影响远比由“loopback“ TCP 套接字。
此外,TCP 套接字比传统 IPC 更具可扩展性(并且可移植!)。如果将来您必须在不同的计算机上运行客户端和服务器怎么办?在“TCP 套接字”场景中,您必须进行 5 分钟的修改,在“传统 IPC”场景中,您必须重写整个 IPC 内容。
但是,您的应用程序的一般工作流程是什么?
即使不需要确认,我建议使用 TCP(而不是 UDP)来避免未排序的传递(这会导致重新排列您收到的内容时的痛苦 - 有些消息是 100KB,而这不适合 UDP 数据包)。
回答你的上一个问题,为了让服务器通知客户端有关端口的信息,你可以让服务器使用特定的“端口”命令行参数启动客户端,或者让服务器在 /tmp 下保存一个小文件(或者另一个临时目录),里面写着端口号。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)