2009-03-11 18 views
24

En nuestro sistema Linux utilizamos pipes con nombre para la comunicación entre procesos (un productor y un consumidor).¿Cómo abrir una tubería con nombre de Windows desde Java?

Para probar el código del consumidor (Java), me gustaría implementar (en Java) un productor ficticio que escribe en un conducto con nombre que está conectado al consumidor.

Ahora la prueba también debería funcionar en el entorno de desarrollo de Windows. Por lo tanto, me gustaría saber cómo crear un conducto con nombre en Windows desde Java. En Linux puedo usar mkfifo (llamado usando Runtime.exec()), pero ¿cómo debo hacer esto en Windows?

Respuesta

22

Use Named Pipes to Communicate Between Java and .Net Processes

Parte pertinente en el enlace

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

¿Funciona el código anterior para alguien? Lo probé en Windows 7 x64, Java 1.7.0_45 y resultó 'java.io.FileNotFoundException: \\. \ Pipe \ testpipe (El sistema no puede encontrar el archivo especificado) en java.io.RandomAccessFile.open (Método nativo) en java.io.RandomAccessFile. (RandomAccessFile.java:122) '. ¿Debería crearse de derecha como se menciona [en esta publicación] (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

Obtuve la respuesta a mi pregunta anterior: en Java no es posible crear un conducto con nombre (a menos que uno use [JNA] (https://github.com/java-native-access/jna/blob/master/contrib /platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java)), solo para abrir uno existente (vea [esta respuesta] (http://stackoverflow.com/a/2247022/267197) y [ esa publicación] (https://cdimascio.wordpress.com/2014/01/11/named-pipes-with-java/)). Muchas gracias a las respuestas a continuación también. –

+1

@dma_k Recibo el mismo error. Parece que no es posible crear una tubería con nombre con Java, pero el código funciona con una tubería existente que se creó en otro proceso (por ejemplo, el proceso .Net en el ejemplo vinculado). – Michael

7

En windows, named pipes exist pero no cannot be created as files in a writeable filesystem y no hay una herramienta de línea de comandos. Viven en un sistema de archivos especial y solo se pueden crear utilizando la API de Win32.

Parece que tendrá que recurrir al código nativo, o cambiar de tuberías a enchufes para IPC - probablemente la mejor solución a largo plazo, ya que es mucho más portátil.

0

tuberías quizás podría usar cygwin nombre - si todos sus procesos se CygWin.

+0

Para hacer esto, necesitaría Java en Cygwin. Me parece bastante improbable, aunque podrías alzarlo con uno de los JRE que no son de Sun. – user314104

Cuestiones relacionadas