命名管道保持服务器活力

问题描述 投票:0回答:2

我正在创建一个与另一个应用程序通信的windows服务。我面临的问题是 NamedPipeServerStream 一旦客户端断开连接就会关闭。我希望服务器应该保持开放,所以每当客户端应用程序启动时,它就会被连接。

我不想使用WCF,消息会很小,所以我只想使用Named Pipes保持简单。多个客户端可以连接到服务。有没有办法让服务器一直运行?

这是我目前所做的。

 var server = new NamedPipeServerStream("pipeeee123");
 server.SetAccessControl(pipeSa);
 server.WaitForConnection();

 StreamReader reader = new StreamReader(server);
 StreamWriter writer = new StreamWriter(server);
 while (true)
 {
     var line = reader.ReadLine();

     this.EventLog.WriteEntry("Got command " + line, EventLogEntryType.Information);
     var resp = HandleCommand(line);
     writer.WriteLine(resp);
     writer.Flush();                
 }
c# .net named-pipes interprocess
2个回答

0
投票

看一下这段代码。

var server = new NamedPipeServerStream("PipesOfPiece");
StreamReader reader = new StreamReader(server);
StreamWriter writer = new StreamWriter(server);
while (true)
{
    if (!server.IsConnected)
    {
        try
        {
            server.WaitForConnection();
        }
        catch (IOException)
        {
            server.Disconnect();
            continue;
        }
    }

    var line = reader.ReadLine();
    if (!server.IsConnected)
    {
        continue;
    }

    if(!string.IsNullOrEmpty(line))
    {
         writer.WriteLine(String.Join("", line.Reverse()));
    }
    writer.Flush();
}

从我看到的情况来看,你的服务器只是因为你没有正确处理connnection的重开+边缘情况而倒下。另外,考虑到你一次只能处理一个客户端的一个实例。


0
投票

我知道这不是异步的,但如果有人想要一个同步的版本,我能够使用下面的方法让它工作。

NamedPipeServerStream server = new NamedPipeServerStream("pipeee", 
    PipeDirection.InOut, 10,
    PipeTransmissionMode.Message, 
    PipeOptions.WriteThrough, 1024, 1024, pipeSecurity);

while (true)
{
     // re-connect if disconnected
     if (!server.IsConnected)
     {
          server = new NamedPipeServerStream("pipeee", 
              PipeDirection.InOut, 10,
              PipeTransmissionMode.Message, 
              PipeOptions.WriteThrough, 1024, 1024, pipeSecurity);
     }

     server.WaitForConnection();

     StreamReader reader = new StreamReader(server);
     StreamWriter writer = new StreamWriter(server);
     while (true)
     {
         var line = reader.ReadLine();

         var resp = HandleCommand(line);
         writer.WriteLine(resp);
         writer.Flush();

         // exit inner loop if disconnected, outer loop will handle re connection
         if(!server.IsConnected)
         {
             break;
         }
     }
}
© www.soinside.com 2019 - 2024. All rights reserved.