2009-03-11 17 views
24

Auf unserem Linux-System verwenden wir Named Pipes für die Interprozesskommunikation (ein Producer und ein Consumer).Wie öffne ich eine Windows Named Pipe von Java?

Um den Consumer (Java) -Code zu testen, möchte ich (in Java) einen Dummy-Producer implementieren, der in eine Named Pipe schreibt, die mit dem Consumer verbunden ist.

Jetzt sollte der Test auch in der Windows-Entwicklungsumgebung funktionieren. Daher würde ich gerne wissen, wie man eine benannte Pipe in Windows von Java erstellt. Unter Linux kann ich mkfifo (mit Runtime.exec()) verwenden, aber wie soll ich das unter Windows machen?

Antwort

22

Use Named Pipes to Communicate Between Java and .Net Processes

Relevante Teil in der Verbindung

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(); 
} 
+2

Funktioniert der obige Code für jemanden? Ich habe es auf Windows 7 x64 versucht, Java 1.7.0_45 und es resultierte 'java.io.FileNotFoundException: \\. \ Pipe \ testpipe (Das System kann die angegebene Datei nicht finden) bei java.io.RandomAccessFile.open (Native Method) bei java.io.RandomAccessFile. (RandomAccessFile.java:122) '. Sollte es im Voraus erstellt werden (http://answers.microsoft.com/en-us/windows/forum/windows8_1-files/windows-81-enterprise-64-bit-running-java-jdk)/f67d1302-905e-4511-ba1b-0888b259258a)? –

+5

Ich habe die Antwort auf meine Frage oben: In Java ist es nicht möglich, eine Named Pipe zu erstellen (es sei denn, man benutzt [JNA] (https://github.com/java-native-access/jna/blob/master/contrib /platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java)), nur um eine bestehende zu öffnen (siehe [diese Antwort] (http://stackoverflow.com/a/2247022/267197) und [ dieser Beitrag] (https://cdimascio.wordpress.com/2014/01/11/named-pipes-with-java/)). Vielen Dank auch an die Antworten. –

+1

@dma_k Ich bekomme den gleichen Fehler. Es scheint, dass es nicht möglich ist, eine benannte Pipe mit Java zu erstellen, aber der Code funktioniert mit einer vorhandenen Pipe, die in einem anderen Prozess erstellt wurde (z. B. der .Net-Prozess im verknüpften Beispiel). – Michael

7

In Windows, named pipes exist aber sie cannot be created as files in a writeable filesystem und es gibt kein Befehlszeilenprogramm. Sie leben in einem speziellen Dateisystem und können nur mithilfe der Win32-API erstellt werden.

Sieht so aus, als müssten Sie auf nativen Code zurückgreifen oder von Pipes auf Sockets für IPC umsteigen - wahrscheinlich die beste Langzeitlösung, da sie viel portabler ist.

0

vielleicht Cygwin Named Pipes verwenden könnte - wenn alle Ihre Prozesse Cygwin.

+0

Um dies zu tun, benötigen Sie Java auf Cygwin. Scheint ziemlich unwahrscheinlich für mich, obwohl Sie es mit einer der Nicht-Sun JREs Flügel könnte. – user314104

Verwandte Themen