7

我目前正在使用 ASP.NET 3.5 和 C# 在 Windows 中学习命名管道。我编写了一个小型服务器程序,它创建了一个命名管道:

using (NamedPipeServerStream pipeStream = new NamedPipeServerStream(pipeName))
{
  pipeStream.WaitForConnection();
  // do sth.
}

和一个客户端应用程序像这样打开管道:

using (NamedPipeClientStream pipeStream = new NamedPipeClientStream(pipeName))
{ 
  pipeStream.Connect();
  // do sth.
}

只要只有一个客户端连接到管道,这就会很好。它既可以读也可以写。如果我尝试连接第二个客户端,代码永远不会超过该行

pipeStream.Connect();

服务器和所有客户端都在同一台机器上运行。有任何想法吗?

非常感谢您!

4

4 回答 4

4

您可以在此处查找一些信息: 可以连接到命名管道的客户端数量

在 MSDN 中:http: //msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx

据我了解,您应该创建一个多线程应用程序。主线程应该负责未来的连接,每个新连接都应该在新线程中启动。

于 2009-10-12T18:47:25.040 回答
1

感谢您的快速帮助。

我已经在单独的线程中处理了真正的处理,但忘了提及这一点。一位同事发现了这个问题:

在服务器端发布的 NamedPipeServerStream-using 块中,我有一个 StreamReader 被另一个 using 块包围。

当这个块完成关闭 StreamReader 时,它也出于某种原因断开了 NamedPipeServerStream。此外,我没有将 pipeStream.WaitForConnection() 封闭在一个循环中。

于 2009-10-12T20:26:48.863 回答
0

一根真正的烟斗(来自硬件商店的烟斗)有两个末端。所以我希望命名管道也有两个端点,一个用于服务器进程,一个用于客户端进程。

但是,无论最终答案是什么,我都建议看一下 WCF - 它支持网络管道绑定(以及许多其他的,例如二进制 TCP、SOAP,只需更改配置即可使用或不使用 WS-* 规范)和句柄服务器激活和多线程为您服务。.net 3.5 可用,所以我肯定会选择它。

于 2009-10-12T20:01:19.320 回答
0

请在此处查看我的答案,了解如何在 .NET 中实现多线程管道服务器

于 2011-02-20T02:23:38.340 回答