На другом конце канала нет процессов - именованные каналы в JAVA - PullRequest
0 голосов
/ 24 октября 2018

Я использую эти коды для связи с принтером Evolis KC200:

@Test
public void studyPipe() {
    try {
        String echoText = " {\"id\":\"1\",\"jsonrpc\":\"2.0\",\"method\":\"CMD.GetStatus\",\"params\":{\"device\":\"Evolis KC200\"}}";

        System.out.println("CMD.GetStatus Request: " + echoText);

        String pipeName = "\\\\.\\pipe\\EspfServer00";
        RandomAccessFile pipe = new RandomAccessFile(pipeName, "rw");

        System.out.println("Writing in pipe: " + echoText + " in pipe "
                + pipeName);
        pipe.write(echoText.getBytes("UTF-8"));
        // Thread.sleep(1000);
        String echoResponse = pipe.readLine();
        System.out.println("Response: " + echoResponse);
        pipe.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

Но все, что я получаю, это:

java.io.IOException: No process is on the other end of the pipe
    at java.io.RandomAccessFile.read0(Native Method)
    at java.io.RandomAccessFile.read(RandomAccessFile.java:330)
    at java.io.RandomAccessFile.readLine(RandomAccessFile.java:939)
    at 

У них есть тестовый инструмент, построенный на другомязык (C #) и его клиент Named Pipe выглядят так: Чего не хватает в моих кодах JAVA?

 public static string SendRequestPipe(string ip, string port, string request)
        {
            NamedPipeClientStream objPipeClient;

            string answer = string.Empty;

            objPipeClient = new NamedPipeClientStream(ip, port, PipeDirection.InOut);
            try
            {
                // Connexion au named pipe ou attente de la disponibilité du named pipe
                objPipeClient.Connect(1000);     

                // Paramétrage de la connexion
                objPipeClient.ReadMode = PipeTransmissionMode.Message;               

                if (objPipeClient.IsConnected == true)
                {
                    // Send request
                    byte[] datain = Encoding.UTF8.GetBytes(request);
                    objPipeClient.Write(datain, 0, datain.Length);

                    // Get answer
                    int recv = 0;
                    byte[] data = new byte[1024];

                    do
                    {
                        recv = objPipeClient.Read(data, 0, data.Length);
                        answer += Encoding.UTF8.GetString(data, 0, recv);                        
                    } while (!objPipeClient.IsMessageComplete);
                }
            }
            catch (Exception ex)
            {                      

            }
            finally
            {
                objPipeClient.Close();
                objPipeClient.Dispose();
            }

            return answer;
        }

Я также пробовал похожие подходы в Java, но получаю ту же ошибку.

ОБНОВЛЕНИЕ:

Я думаю, что уже знаю проблему, но у меня все еще нет разрешения.Кажется, что код JAVA создает еще один экземпляр PIPE, поэтому он не получает никаких процессов в этом новом экземпляре.Я тестировал с кодом C #, и он не создавал новый экземпляр.

Я проверил экземпляры с помощью этого инструмента: https://docs.microsoft.com/en-us/sysinternals/downloads/pipelist

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...