Come aprire una pipe di nome Windows da Java?
-
10-07-2019 - |
Domanda
Sul nostro sistema Linux utilizziamo named pipe per la comunicazione tra processi (un produttore e un consumatore).
Per testare il codice del consumatore (Java), vorrei implementare (in Java) un produttore fittizio che scrive su una pipe denominata che è collegata al consumatore.
Ora il test dovrebbe funzionare anche nell'ambiente di sviluppo di Windows. Quindi vorrei sapere come creare una pipe con nome in Windows da Java. In Linux posso usare mkfifo (chiamato usando Runtime.exec ()
), ma come dovrei farlo su Windows?
Soluzione
Usa pipe denominate per comunicare tra Processi Java e .Net
Parte rilevante nel collegamento
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();
}
Altri suggerimenti
In Windows, esistono pipe con nome ma essi non possono essere creati come file in un filesystem scrivibile e non esiste uno strumento da riga di comando. Vivono in un file system speciale e possono essere creati solo utilizzando 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ù portatile.
È possibile creare una pipe denominata utilizzando la libreria JNA https://github.com/java-native -access / jna
Viene mostrato chiaramente nel seguente test: https://github.com/java-native-access/jna/blob/master/contrib/platform/test/com/sun/jna/platform/win32/ Kernel32NamedPipeTest.java
L'API del wrapper JNA è uguale a Win32, quindi sarai in grado di utilizzare tutte le funzionalità e la potenza delle named pipe su Windows.
È molto possibile leggere e scrivere in una esistente pipe in Java. Per quanto ne so, non è possibile creare una pipe denominata in un ambiente Windows. Linux è una storia diversa in quanto le pipe denominate possono essere create e consumate come file.
Link rilevante sull'interazione con una pipe esistente: http://v01ver-howto.blogspot.com/2010/04/howto-use-named-pipes-to-communicate.html
forse potresti usare le pipe denominate cygwin - se tutti i tuoi processi sono cygwin.