C# 命名管道 server/client

C# namedpipes server/client

我正在尝试了解命名管道的工作原理,以便我可以连接两个 C# 应用程序。

我写了两个基本的 C# 应用程序用于测试,但它不起作用。

当我启动连接时,第一个应用程序冻结等待输入,在我从应用程序 2 发送输入后,它解冻并显示按钮 1。但是文本框中什么也没有出现,知道为什么吗?

应用程序 1:

private void button1_Click(object sender, EventArgs e)
    {
        button1.Hide();

        NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe");
        pipeServer.WaitForConnection();

        StreamReader s = new StreamReader(pipeServer);
        textBox1.Text = s.ReadToEnd();

        pipeServer.Close();

        button1.Show();
    }

应用程序 2:

 private void button1_Click(object sender, EventArgs e)
    {

        NamedPipeClientStream pipeClient = new NamedPipeClientStream("testpipe");
        if (pipeClient.IsConnected != true) pipeClient.Connect();
        StreamWriter sw = new StreamWriter(pipeClient);
        sw.WriteLine("%s", textBox1.Text);

        pipeClient.Close();

    }

您要在 StreamWriter 向其刷新任何数据之前关闭 NamedPipeClientStream。因此,当您从服务器流读取数据时,在连接关闭之前没有可读取的数据,因此您得到一个空字符串。

您可以通过正确处理 StreamWriter 来解决此问题,如下所示:

private void button1_Click(object sender, EventArgs e)
{
    using (var pipeClient = new NamedPipeClientStream("testpipe"))
    {
        if (pipeClient.IsConnected != true) pipeClient.Connect();
        using (var sw = new StreamWriter(pipeClient))
        {
            sw.WriteLine("%s", textBox1.Text);
        }
    }
}

或者,您可以在 StreamWriter 上将 AutoFlush 设置为 true