Реализация прослушивателя именованных каналов в Java, который будет читать именованные каналы Windows - PullRequest
0 голосов
/ 05 июля 2019

Мой код написан на Java, и мне нужно интегрироваться с другой программой на той же машине Windows, которая написана на .NET / WPF. Программа .NET / WPF отправляет данные с использованием именованных каналов Windows, которые запускаются на основе определенных событий, происходящих в приложении .NET. Поэтому мне просто нужно настроить прослушиватель для чтения этих данных из именованного канала Windows при его запуске. Примечание. Мне не нужно создавать именованный канал из Java, только чтобы настроить прослушиватель для чтения именованного канала из приложения Windows .NET.

Попробовал этот поток Одновременное чтение / запись именованного канала в Java (в Windows) , но получаю эту ошибку:

java.io.FileNotFoundException: \. \ Pipe \ pixelcade (система не может найти указанный файл)

Эта ошибка возникает после того, как я запустил программу .NET, которая генерирует именованный канал Windows. Но обратите внимание, что именованный канал запускается при определенных событиях и не передается непрерывно.

try {
// Connect to the pipe
RandomAccessFile pipe = new RandomAccessFile("\\\\.\\pipe\\pixelcade", 
"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();
}

Ожидаемым результатом будет несколько строк из именованных каналов из приложения .NET.

Этот код в C # / WPF - то, что нужно, просто не знаю, как кодировать эквивалент в Java.

// 1. Create a Pipe event handler
_pipeServer = new PipeServer();
_pipeServer.PipeMessage += new DelegateMessage(PipesMessageHandler);

// 2. Then listen for a message
private void Listen()
{
try
{
if (userPrefs.NamedPipeID == string.Empty)
_pipeServer.Listen(_marqueeConfigfileName); // _marqueeConfigfileName is 
the pipename (shake hand between 2 apps; client and server)
else
_pipeServer.Listen(userPrefs.NamedPipeID); // _marqueeConfigfileName is the 
pipename (shake hand between 2 apps; client and server)
}
catch (Exception ex)
{
ApplicationLog.EventWriteLog(ex.Message);
}
}
// 3. Handler, my custom logic goes here
private void PipesMessageHandler(string message)
{
try
{
string[] args = CommandLineToArgs(message);
int paramLengh = args.Length;
if (!CheckAccess())
{
 Dispatcher.Invoke(() => PipesMessageHandler(message));
}
else
{
if (paramLengh > 2) _game = args[2];
if (paramLengh > 3) _gameSystem = args[3];
if (paramLengh > 4) _freetext = args[4];
if (paramLengh > 5) _event = args[5];

ApplicationLog.EventWriteLog("Pipe message received Wheel: ["+_gameSystem 
+"] item: ["+_game+"]");
if (applySettingsThread != null) applySettingsThread.Abort();
applySettingsThread = this.Dispatcher.BeginInvoke(DispatcherPriority.Send, 
new Action(ApplySettings));

}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
...