问题 命名管道用法。多个客户端,一个服务器,多个并行请求


我正在尝试在.NET中实现命名管道服务器。客户端将是C ++。发送的数据的性质与问题无关。

我的第一个天真实现看起来像:

using (NamedPipeServerStream stream = 
                new NamedPipeServerStream(PipeName,
                                          PipeDirection.InOut, 
                                          numberOfListeners,
                                          PipeTransmissionMode.Message))
{
     while (true)
     {
          try
          {
              stream.WaitForConnection();

              var request = ReadRequest(stream);

              var reply = Process(request);
              WriteReply(stream, reply);
              stream.WaitForPipeDrain();
          }
          catch (Exception ex)
          {
              //TO DO: log
          }
     }
 }

我接近这个吗?

当两个客户端同时打开连接时会发生什么?

他们会共享相同的流,数据会混合在一起吗?

我怎么能避免这个?

任何想法或资源都有帮助。我对这个话题很陌生。


12503
2018-04-07 16:14


起源



答案:


您将希望服务器能够处理并发客户端连接,并且每个客户端都可以连接到管道的不同实例上的服务器,而不是像目前的代码那样尝试在一个管道实例上执行所有操作。客户端完成后,您希望释放与该客户端通信时使用的管道实例,而不是重用它。

这个答案 给出了一种伪代码轮廓,说明了这种方法。

另请注意,在消息模式下,您需要在循环中读取管道,直到 IsMessageComplete 财产成了 true。这是保证您获得每条完整信息的唯一方法。还要注意,消息模式中的“消息”表示发送者在一个中写入的字节流 Write 打电话给管道。

客户端流不能相互混淆:管道实例只有两端, THE 客户和 THE 服务器。


12
2018-04-07 16:57



+1感谢您的建议。它现在开始有意义了 - Adrian Zanescu
因为没有其他人对此做出回应,你的回答对我来说已经足够好了,我会接受它作为正确的回答。谢谢。我设法以正确的方式实现我的服务器。 - Adrian Zanescu


答案:


您将希望服务器能够处理并发客户端连接,并且每个客户端都可以连接到管道的不同实例上的服务器,而不是像目前的代码那样尝试在一个管道实例上执行所有操作。客户端完成后,您希望释放与该客户端通信时使用的管道实例,而不是重用它。

这个答案 给出了一种伪代码轮廓,说明了这种方法。

另请注意,在消息模式下,您需要在循环中读取管道,直到 IsMessageComplete 财产成了 true。这是保证您获得每条完整信息的唯一方法。还要注意,消息模式中的“消息”表示发送者在一个中写入的字节流 Write 打电话给管道。

客户端流不能相互混淆:管道实例只有两端, THE 客户和 THE 服务器。


12
2018-04-07 16:57



+1感谢您的建议。它现在开始有意义了 - Adrian Zanescu
因为没有其他人对此做出回应,你的回答对我来说已经足够好了,我会接受它作为正确的回答。谢谢。我设法以正确的方式实现我的服务器。 - Adrian Zanescu