Java和C / C ++程序之间的命名管道

时间:2010-11-06 08:40:28

标签: java c++ c networking connection

我想在windows中使用一个命名管道来在两个用Java和C编写的应用程序之间进行通信。通常我使用套接字连接来做到这一点,但现在我必须取消这个想法并找到一个新的解决方案。

我读到java中的命名管道只能在JVM中可见 - 这是真的吗? 有没有办法在两个不同语言的应用程序之间建立命名管道?

如果没有,你建议采用什么样的技术?

3 个答案:

答案 0 :(得分:3)

为了在Java中创建 Windows命名管道,您必须使用JNI来调用本机WINAPI函数。

但是,您可以在C ++中创建命名管道,并在创建后将其作为管道命名空间中的文件打开,以Java格式使用它。

答案 1 :(得分:2)

命名管道比使用套接字要困难得多。从概念上讲,它们更简单。然而,使它们可靠且合理地容错比使用插座要困难得多。

我建议你重新考虑套接字,这是为进程之间的通信而设计的。你能澄清为什么你不能使用套接字?我问的原因是命名管道实际上实际上使用了套接字而不是环回。

命名管道是OS构造。您可以在操作系统中创建命名管道,然后可以像Java和C或任何其他程序一样访问它。通过文件进行流程之间的通信非常难以正确(如果不是不可能)例如,当您写入命名管道时,除非您设计自己的流控制协议,否则您将无法读取任何内容。 (在所有情况下都很难测试)

您可能听说过PipedInputStream和PipedOutputStream,这些类只能在同一个进程中使用(使它们毫无用处)

编辑:如果你想要一个独立的视图来发送数据最常见,也可能是最明智的方法,我建议你试试google。

java sockets - 2,210,000 hits
java named pipes - 90,000 hits

所以也许套接字比命名管道容易25倍。 (并且更多可以支持,因为有更多的教程和有经验的人)

答案 2 :(得分:0)

您只需在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();