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();