管道的另一端没有进程-JAVA中的命名管道

时间:2018-10-24 07:55:36

标签: java named-pipes

我在与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#)构建的测试工具,其命名管道客户端如下所示: 我的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

0 个答案:

没有答案