2011-12-08 16 views
5

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); 
    } 
} 
+0

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í. –

+1

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

Respuesta

1

no se puede leer de un hilo y escribir en otro hilo al mismo objeto tubería. Por lo tanto, aunque podría crear un protocolo donde la posición de escucha cambia según los datos que está enviando, no puede hacer ambas cosas al mismo tiempo. Necesitará un conducto de cliente y servidor en ambos lados para hacer esto.

Cuestiones relacionadas