簡體   English   中英

在命名管道上讀寫

[英]Reading and writing on and from named pipe

我正在為此目的編寫的測試應用程序中嘗試使用命名管道的 IPC。 我想從管道中讀取一個值,但讀者似乎什么也沒讀到。

我正在啟動一個服務器進程和一個客戶端。 服務器使用名為InitPipe的命名管道告訴客戶端用於通信的新管道的名稱。 之后,一個新的服務器進程和客戶端連接到新管道,另一個服務器進程和客戶端斷開連接, InitPipe重新打開,以便新進程與服務器通信。 客戶端將數據寫入管道,新的服務器進程應該讀取數據。 這就是問題所在。 服務器似乎沒有從管道中獲取值。

private void svr_task(string comPipe)
    {
        var server = new NamedPipeServerStream(comPipe);
        write("Com-Pipe: " + comPipe);        //'write' just writes to a TextBox on the UI thread

        server.WaitForConnection();
        write("Client connected: " + comPipe);

        StreamReader reader = new StreamReader(server);
        StreamWriter writer = new StreamWriter(server);

        while (server.IsConnected)
        {
            var line = reader.ReadLine();     //the program doesn't seem to run past this line

            write(line);
        }
        write("Client disconnected: " + comPipe);
        server.Dispose();
        write("Com-Pipe closed: " + comPipe);
    }

    private void cl_start()
    {
        //This is for InitPipe
        var clientInit = new NamedPipeClientStream("InitPipe");
        NamedPipeClientStream client = new NamedPipeClientStream("InitPipe");

        clientInit.Connect();
        Dispatcher.Invoke(() => stat_cl1.Content = "Initialize...");
        StreamReader reader = new StreamReader(clientInit);
        StreamWriter writer = new StreamWriter(clientInit);

        while (clientInit.IsConnected)
        {
            var line = reader.ReadLine();
            client = new NamedPipeClientStream(line);
            clientInit.Dispose();
        }

        //This is where the communication with the server thread starts
        client.Connect();
        Dispatcher.Invoke(() => stat_cl1.Content = "Connected");
        reader = new StreamReader(client);
        writer = new StreamWriter(client);

        while (client.IsConnected)
        {
            string line = Dispatcher.Invoke(() => box_cl1.Text);      //read a value from a textbox (This works)

            writer.Write(line);
            writer.Flush();
        }

        client.Dispose();
        Dispatcher.Invoke(() => stat_cl1.Content = "Not connected");
    }

我希望服務器線程從客戶端線程接收值。 UI 線程未鎖定,因此我可以啟動另一個客戶端,該客戶端也可以連接到服務器線程。 在 VS 中調試和單步執行代碼時,它只是在var line = reader.ReadLine();之后運行var line = reader.ReadLine(); 並且似乎永遠不會到達下一行。 所以這就是為什么我認為它無法從管道中讀取任何值。 但是我需要改變什么? 我想用write輸出值。

我遇到了類似的問題。 它與命名管道的工作方式有關。 您可以一次寫入或讀取命名管道。 盡量不要同時將 StreamReader 和 StreamWriter 附加到流。 我通過單獨的讀取器流和寫入器流解決了這個問題。 此外,您可以為多個客戶端使用相同的管道名稱,您只需在客戶端連接后創建一個新的服務器實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM