如何在C#中正确使用命名管道 - 多个连接,服务器娱乐等

Fro*_*art 7 c# named-pipes interprocess

我需要在C#应用程序之间实现进程间通信.我决定使用命名管道并编写以下代码:

服务器

while (true)
{
    using (var server = new NamedPipeServerStream("some_pipe"))
    {
        server.WaitForConnection();
        using (var reader = new StreamReader(server))
        {
            string line = reader.ReadLine();
            MessageBox.Show(line);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

客户

using (var client = new NamedPipeClientStream("some_pipe"))
{
    client.Connect();

    using (var writer = new StreamWriter(client))
    {
        writer.AutoFlush = true;
        writer.WriteLine(path);
        client.WaitForPipeDrain();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有以下问题:

  • 这个解决方案是否正确?您是否已经看到任何问题或错误?
  • 如果第二个客户端将尝试连接到此服务器,会发生什么?是否会等待第一个客户端完成或只是将其消息与另一个客户端的实例一起发送导致垃圾?
  • 我应该NamedPipeServerStream每次都真正创建另一个类实例吗?如果我从while (true)循环移动它的结构,它给我一个例外"无法访问一个封闭的管道".我怎么能避免呢?如果我无法避免它并且每次都应该重新创建这个对象,那么NamedPipeServerStream当客户端尝试连接它时会发生什么?

Fid*_*zco 8

这是行不通的。多个客户端仅连接到一个 NamedPipeServerStream 是一项不可用的功能。它带有“...ServerStream”的名称具有误导性。管道是 1 对 1 连接。您必须有多个服务器实例为多个客户端提供相同的管道服务。这个代码项目展示了如何实现一个服务器管道并且可以帮助你

  • 但是 [在 MSDN 上](https://msdn.microsoft.com/en-us/library/bb762927(v=vs.110).aspx) 它说“命名管道可以是单向的或双工的。他们支持消息-基于通信并允许多个客户端使用相同的管道名称同时连接到服务器进程”。 (7认同)
  • @ensisNoctis 到同一个服务器*进程*,而不是同一个`NamedPipeServerStream`。服务器进程需要启动与客户端数量一样多的 `NamedPipeServerStream`。 (7认同)