命名管道服务器&客户 - 没有消息

时间:2011-10-07 19:55:27

标签: c# named-pipes

我正在努力学习如何做命名管道。所以我在LinqPad中创建了一个服务器和客户端。

这是我的服务器:

var p = new NamedPipeServerStream("test3", PipeDirection.Out);
p.WaitForConnection();
Console.WriteLine("Connected!");
new StreamWriter(p).WriteLine("Hello!");
p.Flush();
p.WaitForPipeDrain();
p.Close();

这是我的客户:

var p = new NamedPipeClientStream(".", "test3", PipeDirection.In);
p.Connect();
var s = new StreamReader(p).ReadLine();
Console.Write("Message: " + s);
p.Close();

我运行服务器,然后是客户端,我看到“已连接!”出现在服务器上,以便正确连接。但是,客户端始终显示Message:后面没有任何内容,因此数据实际上并不是从服务器传送到客户端以进行显示。我已经尝试交换管道方向并让客户端以相同的结果将数据发送到服务器。

为什么在这个例子中屏幕上没有打印出数据?我错过了什么?

谢谢!

2 个答案:

答案 0 :(得分:3)

如同L.B所说,你必须冲洗StreamWriter。但采用using模式可以防止出现这样的错误:

using (var p = new NamedPipeServerStream("test3", PipeDirection.Out))
{
    p.WaitForConnection(); 
    Console.WriteLine("Connected!"); 
    using (var writer = new StreamWriter(p))
    {
         writer.WriteLine("Hello!");
         writer.Flush();
    }
    p.WaitForPipeDrain(); 
    p.Close();
}

在上面的代码中,即使省略了Flush()Close(),一切都会按预期工作(因为这些操作也是在处理对象时执行的)。此外,如果抛出任何异常,仍然可以正确清理所有内容。

答案 1 :(得分:2)

按如下方式更改服务器代码:

StreamWriter wr = new StreamWriter(p);
wr.WriteLine("Hello!\n");
wr.Flush();

您的字符串不会在StreamWriter中刷新