【问题标题】:Named Pipe Server & Client - No Message命名管道服务器和客户端 - 无消息
【发布时间】:2011-10-07 19:55:27
【问题描述】:

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

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

谢谢!

【问题讨论】:

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

标签: c# named-pipes


【解决方案1】:

就像 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(),一切都会按预期进行(因为这些操作也会在对象被释放时执行)。此外,如果抛出任何异常,仍然会正确清理所有内容。

【讨论】:

  • 看起来像 p.WaitForPipeDrain();属于一行:使用块进入streamwriter。否则使用块关闭管道并导致 System.ObjectDisposedException Message=Cannot access a closed pipe.
【解决方案2】:

如下更改你的服务器代码:

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

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

【讨论】:

  • 是的,您需要在最高级别刷新(通常应避免在未先关闭该流的所有用户的情况下关闭流)。但是我认为不需要额外的\n
  • 哇哦,就是这样!非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
  • 2012-10-18
  • 2012-02-11
相关资源
最近更新 更多