2011-10-07 65 views
2

我正在尝试学习如何执行命名管道。所以我在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:,因此数据实际上并不是从服务器传输到客户端以显示。我已经尝试交换管道方向并让客户端向服务器发送相同结果的数据。

为什么这个例子中的数据不是在屏幕上打印出来的?我错过了什么?

谢谢!

+0

根据StreamReader.ReadLine文档,如果到达尾流,它将返回null。这可能是在您执行ReadLine时,管道中没有数据并且流是空的。如果s为空,您可能想循环回去并再次尝试读取。 – user957902

回答

2

如下修改服务器代码:

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

您的字符串不StreamWriter的

+0

是的,你需要在最高级别刷新(关闭一个流而不先关闭该流的所有用户通常应该避免)。但是,我不认为需要额外的'\ n'。 –

+0

Wahoo,就是这样!非常感谢你!! – mellamokb

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()省略,如预期就不会有什么问题(因为当物体布置还进行这些操作)。而且,如果抛出异常,所有东西都会被正确清理。

相关问题