c# - System.IO.Exception: la tubería está rota
.net-3.5 named-pipes (2)
El problema para mí se produjo cuando llamaba pipe.WaitForConnection () desde el servidor, después de que el cliente se desconectó. La solución es capturar la excepción IOException y llamar a pipe.Disconnect (), y luego llamar a pipe.WaitForConnection () nuevamente:
while (true)
{
try
{
_pipeServer.WaitForConnection();
break;
}
catch (IOException)
{
_pipeServer.Disconnect();
continue;
}
}
Tengo dos aplicaciones .NET que se comunican entre sí a través de una canalización con nombre. Todo es excelente la primera vez, pero después de que se envía el primer mensaje y el servidor va a escuchar nuevamente, el método WaitForConnection()
lanza una System.IO.Exception
con el mensaje Pipe está roto.
¿Por qué estoy recibiendo esta excepción aquí? Esta es la primera vez que trabajo con tuberías, pero un patrón similar me ha funcionado en el pasado con sockets.
Código ahoy!
Servidor:
using System.IO.Pipes;
static void main()
{
var pipe = new NamedPipeServerStream("pipename", PipeDirection.In);
while (true)
{
pipe.Listen();
string str = new StreamReader(pipe).ReadToEnd();
Console.Write("{0}", str);
}
}
Cliente:
public void sendDownPipe(string str)
{
using (var pipe = new NamedPipeClientStream(".", "pipename", PipeDirection.Out))
{
using (var stream = new StreamWriter(pipe))
{
stream.Write(str);
}
}
}
La primera llamada a sendDownPipe hace que el servidor imprima el mensaje que envío, pero cuando vuelve a escucharse, se detiene.
Publicaré mi código que parece funcionar. Tenía curiosidad, ya que nunca hice nada con tuberías. No encontré la clase que nombras para el lado del servidor en el espacio de nombres relevante, así que aquí está el código basado en NamedPipeServerStream . Lo de la devolución de llamada es solo porque no me pueden molestar con dos proyectos.
NamedPipeServerStream s = new NamedPipeServerStream("p", PipeDirection.In);
Action<NamedPipeServerStream> a = callBack;
a.BeginInvoke(s, ar => { }, null);
...
private void callBack(NamedPipeServerStream pipe)
{
while (true)
{
pipe.WaitForConnection();
StreamReader sr = new StreamReader(pipe);
Console.WriteLine(sr.ReadToEnd());
pipe.Disconnect();
}
}
Y el cliente hace esto:
using (var pipe = new NamedPipeClientStream(".", "p", PipeDirection.Out))
using (var stream = new StreamWriter(pipe))
{
pipe.Connect();
stream.Write("Hello");
}
Puedo repetir el bloque anterior varias veces con el servidor en ejecución, no hay problema.