Warum erzeugt mein benannterPipe keine Ausgabe in Java?
Posted: 13 May 2025, 19:01
Ich versuche, in Java eine benannte Pipe unter Fenstern zu erstellen.
Hat jemand eine Idee, was ich möglicherweise falsch mache?
Code: Select all
final String pipeName = "\\\\.\\pipe\\test" ;
WinNT.HANDLE hNamedPipe = Kernel32.INSTANCE.CreateNamedPipe(pipeName,
WinBase.PIPE_ACCESS_DUPLEX, // dwOpenMode
WinBase.PIPE_TYPE_MESSAGE | WinBase.PIPE_READMODE_MESSAGE | WinBase.PIPE_WAIT, // dwPipeMode
1, // nMaxInstances,
MAX_BUFFER_SIZE, // nOutBufferSize,
MAX_BUFFER_SIZE, // nInBufferSize,
(int) TimeUnit.SECONDS.toMillis(30L), // nDefaultTimeOut,
null // lpSecurityAttributes
);
logger.info("Await client connection");
Kernel32.INSTANCE.ConnectNamedPipe(hNamedPipe, null);
logger.info("Client connected");
String testmessage = "Test Message";
IntByReference lpNumberOfBytesWritten = new IntByReference(0);
Kernel32.INSTANCE.WriteFile(hNamedPipe, testmessage.getBytes(), testmessage.getBytes().length, lpNumberOfBytesWritten, null);
logger.info("Echoed client data - length=" + lpNumberOfBytesWritten.getValue());
Kernel32.INSTANCE.FlushFileBuffers(hNamedPipe);
< /code>
Mit einem zweiten Programm möchte ich als Client eine Verbindung herstellen und den Inhalt lesen.void testReceive() throws Exception {
String pipeName = "\\\\.\\pipe\\test";
try (RandomAccessFile reader = new RandomAccessFile(pipeName, "r")) {
System.out.println("Waiting for Named Pipe...");
String line;
while ((line = reader.readLine()) != null) {
System.out.println("Received: " + line);
}
}
}
< /code>
Das Problem, mit dem ich ausgesetzt bin, ist, dass das zweite Programm die Nachricht nur empfängt, wenn das Handle im ersten Abschluss geschlossen ist.$pipeServer = [System.IO.Pipes.NamedPipeServerStream]::new("test", [System.IO.Pipes.PipeDirection]::InOut, 1)
$pipeServer.WaitForConnection()
$reader = New-Object System.IO.StreamReader($pipeServer)
$writer = New-Object System.IO.StreamWriter($pipeServer)
$writer.AutoFlush = $true
$writer.WriteLine("TestMessage")
while ($true) {
$reader.ReadLine() #block
}