我正在创建一个与另一个应用程序通信的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();
}
Named Pipe Instances有望在客户端断开连接时终止,请看。https:/docs.microsoft.comen-uswindowswin32ipcnamed-pipe-instances?redirectedfrom=MSDN。.
关于多客户服务,请看以下项目。https:/www.codeproject.comArticles864679Creating-a-Server-Using-Named-Pipes。
也或许对你有所帮助。如何在C#中正确使用命名管道 -- -- 多个连接,服务器重新创建等。
看一下这段代码。
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的重开+边缘情况而倒下。另外,考虑到你一次只能处理一个客户端的一个实例。
我知道这不是异步的,但如果有人想要一个同步的版本,我能够使用下面的方法让它工作。
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;
}
}
}