2009-03-11 5 views
24

Sul nostro sistema Linux utilizziamo pipe denominate per la comunicazione tra processi (un produttore e un consumatore).Come aprire una pipe denominata Windows da Java?

Per testare il codice utente (Java), vorrei implementare (in Java) un produttore fittizio che scrive su una named pipe che è collegata al consumatore.

Ora il test dovrebbe funzionare anche nell'ambiente di sviluppo di Windows. Quindi mi piacerebbe sapere come creare una named pipe in Windows da Java. In Linux posso usare mkfifo (chiamato usando Runtime.exec()), ma come dovrei farlo su Windows?

risposta

22

Use Named Pipes to Communicate Between Java and .Net Processes

parte rilevante nel link

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

Il codice sopra funziona per qualcuno? Ho provato su Windows 7 x64, Java 1.7.0_45 e risultava 'java.io.FileNotFoundException: \\. \ Pipe \ testpipe (Il sistema non riesce a trovare il file specificato) su java.io.RandomAccessFile.open (metodo nativo) su java.io.RandomAccessFile. (RandomAccessFile.java:122) '. Dovrebbe essere creato direttamente come menzionato [in questo post] (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

Ho ottenuto la risposta alla mia domanda sopra: in Java non è possibile creare una named pipe (a meno che non si usi [JNA] (https://github.com/java-native-access/jna/blob/master/contrib /platform/test/com/sun/jna/platform/win32/Kernel32NamedPipeTest.java)), solo per aprirne uno esistente (vedi [questa risposta] (http://stackoverflow.com/a/2247022/267197) e [ quel post] (https://cdimascio.wordpress.com/2014/01/11/named-pipes-with-java/)). Molte grazie anche alle risposte di seguito. –

+1

@dma_k Ottengo lo stesso errore. Sembra che non sia possibile creare una named pipe con Java ma il codice funziona con una pipe esistente che è stata creata in un altro processo (ad esempio il processo .Net nell'esempio collegato). – Michael

7

In windows, named pipes exist ma sono cannot be created as files in a writeable filesystem e non esiste uno strumento da riga di comando. Vivono in un filesystem speciale e possono essere creati solo usando l'API Win32.

Sembra che dovrai ricorrere al codice nativo o passare da pipe a socket per IPC, probabilmente la migliore soluzione a lungo termine, dal momento che è molto più portabile.

0

tubi forse potrebbe utilizzare cygwin nome - se tutti i processi sono Cygwin.

+0

Per fare ciò, è necessario Java su Cygwin. Mi sembra abbastanza improbabile, anche se potresti schierarlo con uno dei non-Sun JRE. – user314104