Java和C / C ++程序之间的命名管道
我想在windows中使用一个命名管道来在用Java和C编写的两个应用程序之间进行通信。通常我使用套接字连接来做到这一点,但现在我必须取消这个想法并找到一个新的解决方案。
我读到java中的命名管道只能在JVM中可见 – 这是真的吗? 有没有办法在两个不同语言的应用程序之间建立命名管道?
如果没有,你建议采用什么样的技术?
为了在Java中创建 Windows命名管道,您必须使用JNI来调用本机WINAPI函数。
但是,您可以在C ++中创建命名管道,并在创建之后通过在管道命名空间中将其作为文件打开来在Java中使用它。
命名管道比使用套接字要困难得多。 从概念上讲,它们更简单。 然而,使它们可靠且合理地容错比使用sockets要困难得多。
我建议你重新考虑套接字,这是为进程之间的通信而设计的。 你能说明为什么你不能使用套接字吗? 我问的原因是命名管道实际上使用了套接字而不是环回。
命名管道是OS构造。 您可以在操作系统中创建命名管道,然后可以像Java和C或任何其他程序一样访问它。 通过文件进行流程之间的通信非常难以正确(如果不是不可能)例如,当您写入命名管道时,除非您设计自己的流控制协议,否则您将无法读取任何内容。 (在所有情况下都很难测试)
您可能听说过PipedInputStream和PipedOutputStream,这些类只能在同一个进程中使用(使它们毫无用处)
编辑:如果你想要一个独立的视图,最常见的,可能是最明智的方式发送数据,我建议你尝试谷歌。
java sockets - 2,210,000 hits java named pipes - 90,000 hits
所以也许套接字比命名管道容易25倍。 (并且更多可以支持,因为有更多的教程和有经验的人)
您只需在Java中启动外部进程并连接到它的管道即可。
// Execute command String command = "ls"; Process child = Runtime.getRuntime().exec(command); // Get pipes from process InputStream in = child.getInputStream(); OutputStream out = child.getOutputStream(); InputStream error = child.getErrorStream();