He escrito una pequeña aplicación que crea un servidor de tuberías con nombre y un cliente que se conecta a él. Puede enviar datos al servidor y el servidor los lee con éxito.¿Puedes leer y escribir con un único cliente de Named Pipe?
Lo siguiente que tengo que hacer es recibir mensajes del servidor, por lo que tengo otro hilo que genera y sienta y espera los datos entrantes.
El problema es que mientras el hilo está esperando datos entrantes, ya no puede enviar mensajes al servidor porque se cuelga en la llamada WriteLine
ya que supongo que la tubería está ahora activada verificando los datos.
Entonces, ¿es solo que no me estoy acercando a esto correctamente? ¿O las tuberías con nombre no están destinadas a ser usadas así? Los ejemplos que he visto en las canalizaciones con nombre parecen ir solo en una dirección, un cliente envía y un servidor recibe, aunque puede especificar la dirección de una tubería como In
, Out
o ambas.
¡Cualquier ayuda, consejos o sugerencias se agradecerán!
Heres' el código hasta ahora:
// Variable declarations
NamedPipeClientStream pipeClient;
StreamWriter swClient;
Thread messageReadThread;
bool listeningStopRequested = false;
// Client connect
public void Connect(string pipeName, string serverName = ".")
{
if (pipeClient == null)
{
pipeClient = new NamedPipeClientStream(serverName, pipeName, PipeDirection.InOut);
pipeClient.Connect();
swClient = new StreamWriter(pipeClient);
swClient.AutoFlush = true;
}
StartServerThread();
}
// Client send message
public void SendMessage(string msg)
{
if (swClient != null && pipeClient != null && pipeClient.IsConnected)
{
swClient.WriteLine(msg);
BeginListening();
}
}
// Client wait for incoming data
public void StartServerThread()
{
listeningStopRequested = false;
messageReadThread = new Thread(new ThreadStart(BeginListening));
messageReadThread.IsBackground = true;
messageReadThread.Start();
}
public void BeginListening()
{
string currentAction = "waiting for incoming messages";
try
{
using (StreamReader sr = new StreamReader(pipeClient))
{
while (!listeningStopRequested && pipeClient.IsConnected)
{
string line;
while ((line = sr.ReadLine()) != null)
{
RaiseNewMessageEvent(line);
LogInfo("Message received: {0}", line);
}
}
}
LogInfo("Client disconnected");
RaiseDisconnectedEvent("Manual disconnection");
}
// Catch the IOException that is raised if the pipe is
// broken or disconnected.
catch (IOException e)
{
string error = "Connection terminated unexpectedly: " + e.Message;
LogError(currentAction, error);
RaiseDisconnectedEvent(error);
}
}
Por supuesto, eso es posible siempre y cuando no necesite asincronizar. Esa es VERDADERA INDEPENDENCIA, mientras que su uso de 2 tubos para leer y escribir está destinado a SER TRIBULARMENTE EN DEPENDENCIA, así que supongo que los nombraré así. –
Suena un poco críptico ... ¿Así que creo que está diciendo que debería haber una pipa para leer y otra pipa para escribir, ya que solo puede usar la acción uno a uno en cualquier momento? Si es así, eso tiene sentido – w69rdy