我目前正在使用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();
服务器和所有客户端都在同一台计算机上运行。 有什么想法吗?
非常感谢你!
答案 0 :(得分:4)
你可以在这里查看一些信息: Number of Clients that can connect to a Named Pipe
在MSDN中:http://msdn.microsoft.com/en-us/library/aa365594%28VS.85%29.aspx
据我所知,您应该创建一个多线程应用程序。主线程应该负责将来的连接,并且每个新连接都应该在新线程中启动。
答案 1 :(得分:1)
感谢您的快速帮助。
我已经在单独的线程中处理了实际处理,但忘记提及。 一位同事发现了这个问题:
我在服务器端发布的NamedPipeServerStream-using块中使用了另一个封闭的StreamReader。
当此块完成关闭StreamReader时,它还因某种原因断开了NamedPipeServerStream。另外,我没有在循环中包含pipeStream.WaitForConnection()。
答案 2 :(得分:0)
真正的管道(来自hardwre商店的管道)有两个结尾。所以我希望命名管道也有两个端点,一个用于服务器进程,另一个用于客户端进程。
然而,不管最后的答案是什么,我建议看一下WCF - 它支持网络管道绑定(以及许多其他像二进制TCP,只要更改配置就有或没有WS- *规范的SOAP) )并为您处理服务器激活和多线程。 .net 3.5可用,所以我肯定会选择它。
答案 3 :(得分:0)