【问题标题】:How to open a Windows named pipe from Java?如何从 Java 打开 Windows 命名管道?
【发布时间】:2010-10-12 16:24:44
【问题描述】:

在我们的 Linux 系统上,我们使用命名管道进行进程间通信(生产者和消费者)。

为了测试消费者 (Java) 代码,我想(在 Java 中)实现一个虚拟生产者,它写入连接到消费者的命名管道。

现在测试应该也可以在 Windows 开发环境中运行了。因此,我想知道如何在 Windows 中从 Java 创建命名管道。在 Linux 中我可以使用 mkfifo(使用 Runtime.exec() 调用),但我应该如何在 Windows 上执行此操作?

【问题讨论】:

    标签: java windows named-pipes


    【解决方案1】:

    您可以使用 JNA 库 https://github.com/java-native-access/jna 创建命名管道

    在下面的测试中很明显:https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java

    JNA wrapper 的 API 与 Win32 相同,因此您将能够在 Windows 上使用命名管道的所有功能和功能。

    【讨论】:

      【解决方案2】:

      Use Named Pipes to Communicate Between Java and .Net Processes

      链接中的相关部分

      try {
        // Connect to the pipe
        RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\testpipe", "rw");
        String echoText = "Hello word\n";
        // write to pipe
        pipe.write ( echoText.getBytes() );
        // read response
        String echoResponse = pipe.readLine();
        System.out.println("Response: " + echoResponse );
        pipe.close();
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
      

      【讨论】:

      • 上面的代码对某人有用吗?我已经在 Windows 7 x64、Java 1.7.0_45 上尝试过,结果是java.io.FileNotFoundException: \\.\pipe\testpipe (The system cannot find the file specified) at java.io.RandomAccessFile.open(Native Method) at java.io.RandomAccessFile.<init>(RandomAccessFile.java:122)。是否应该像in this post 提到的那样创建正手?
      • 我得到了上述问题的答案:在 Java 中,不可能创建命名管道(除非使用 JNA),只能打开现有管道(参见 this answer 和 @ 987654325@)。也非常感谢下面的答案。
      • @dma_k 我得到了同样的错误。似乎无法使用 Java 创建命名管道,但代码适用于在其他进程中创建的现有管道(例如链接示例中的 .Net 进程)。
      【解决方案3】:

      在 Java 中很可能读取和写入 现有 命名管道。据我所知,您不能在 Windows 环境中创建命名管道。 Linux 是另一回事,因为命名管道可以像文件一样创建和使用。

      与现有管道交互的相关链接:http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html

      【讨论】:

        【解决方案4】:

        也许可以使用 cygwin 命名管道——如果你的所有进程都是 cygwin。

        【讨论】:

        • 为了做到这一点,您需要在 Cygwin 上安装 Java。对我来说似乎不太可能,尽管您可以使用非 Sun JRE 之一来实现它。
        【解决方案5】:

        在 windows 中,named pipes exist 但他们 cannot be created as files in a writeable filesystem 并且没有命令行工具。它们存在于一个特殊的文件系统中,只能使用 Win32 API 创建。

        看起来您将不得不求助于本机代码,或者从管道切换到 IPC 的套接字——这可能是最好的长期解决方案,因为它更便携。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多