2023-01-19 378
在以下情况下实现C ++/Java IPC的最佳方法是什么?
(最近有人问A 类似的问题,但我的要求更多具体)
我有两个程序 – 一个用C ++写的程序,另一个用Java编写 – 需要相互交流.两者都在同一台计算机上运行.
程序相互发送消息.消息通常很短(少于几百个字节),但可能是100kb或更大的.
不需要确认消息(即,不是像HTTP这样的请求/响应模型).例如,C ++程序将消息发送给Java程序,Java程序可以通过以后将消息发送给C ++程序来回复 – 反之亦然.
理想的解决方案将具有a)非常低的延迟,b)没有安全麻烦(用户不必授权打开端口./li>
我的第一个想法是使用套接字 – 每个程序将充当另一个程序.插座比其他形式的IPC具有更多的开销,如果我让系统自动分配端口号,我不知道服务器如何将端口号告知客户端.我还考虑了命名的管道,但是在不同平台上不支持(至少不始终如一). jni 看起来像是一个选择,但是它可以交叉过程界限吗?
有什么建议?
谢谢!
后续问题
我建议您使用 tcp插座.
与其他任务的应用程序的工作量相比,TCP插座的实际开销非常低,至少是我用来开发的应用程序.我的意思是,有时,即使插座的潜伏期是其他IPC机制的延迟的两倍,在整体工作流程中,它们的影响很小.它为您节省了在Java应用程序和C ++之间制作IPC的麻烦,最终将要求您使用使用JNI的特定Java库,其中JNI的开销和库本身之一.
.
我实际上在我的Java应用程序中测量了垃圾收集器的影响要比” loopback ” TCP插座引起的延迟更为重要.
此外,与传统IPC相比,TCP插座更可扩展(和便携式!).如果将来您必须在不同的机器上运行客户端和服务器怎么办?在” TCP插座”方案中,您必须在”传统IPC”方案中进行5分钟的黑客攻击,您必须重写整个IPC.
但是,您的应用程序的一般工作流程是什么?
即使不需要确认,我建议使用TCP(而不是UDP)来避免未分类的交付(这会导致您收到的东西重新排列时的屁股疼痛 – 您的某些消息是100KB,这不适合UDP数据包).
回答您的最后一个问题,供服务器告知客户端端口有关,您只需使服务器使用特定的”端口”命令行参数启动客户端,或者使服务器在/下保存一个小文件. TMP(或另一个临时目录),内部写了端口号.
我听说过关于 Zeromq 的好消息.在某些情况下,它甚至比TCP更快.简而言之,尝试一下不会有任何伤害.
另一种替代方法是使用内存映射的文件,并通过检查编译器设置是否为POSIX,并将其存放. Posix OS具有mmap(),在Windows中,您将使用CreateFileMapping()
在Boost库中是C ++的便携式实现,在Java中,您应该能够使用FileChannel().
此页面很好地解释了如何将其用于IPC .wikipedia.org/wiki/memory-mapped_file
以上所述是小编给大家介绍的C ++和Java之间的低延迟IPC,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/25775.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态