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
。
我正在尝试了解命名管道的工作原理,以便我可以连接两个 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
。