title: Pipe communication using threads
body: <p>I have two executables: <strong>client.exe</strong> and <strong>server.exe</strong>.</p>
  
  <p>They communicate with each other by using <strong>named pipes</strong>. They work fine when the server only listens client requests and sends response to the client.</p>
  
  <p>But now the requirement is both exes contain client pipe and server pipe. So each exe contains two methods: <code>serverpipe()</code> and <code>clientpipe()</code>. Those methods are in a thread and do not communicate to each other.</p>
  
  <p>First client and server communicate properly.</p>
  
  <p>Client.EXE:</p>
  
  <pre><code>public static void Main(string[] Args)
  {
      PipeClient obj=new PipeClient();
      obj.client();
      Thread startserver = new Thread(new ThreadStart(obj.server));
      startserver.Start();
  }
  
  public void client()
  {
      int cnt =0;
      while (true)
      {
         System.IO.Pipes.NamedPipeClientStream pipeClient = new System.IO.Pipes.NamedPipeClientStream(".", "\\\\.\\pipe\\SamplePipe1", System.IO.Pipes.PipeDirection.InOut, System.IO.Pipes.PipeOptions.None);
  
          if (pipeClient.IsConnected != true) { pipeClient.Connect(); }
  
          StreamReader sr = new StreamReader(pipeClient);
          StreamWriter sw = new StreamWriter(pipeClient);
  
          string temp;
          temp = sr.ReadLine();
  
          if (temp == "Waiting")
          {
              try
              {
                  cnt++;
                  sw.WriteLine("clientSide Message " + cnt);
                  sw.Flush();
                  Thread.Sleep(10000);
  
              }
              catch (Exception ex) { throw ex; }
          }
          else
          {
  
          }
          pipeClient.Close();
      } 
  
  }
  
  public void server()
  {
      StreamWriter sw1 = new StreamWriter("C:\\ServerEXE\\serverdataFile0.txt", true);
  
      System.IO.Pipes.NamedPipeServerStream pipeServer = new System.IO.Pipes.NamedPipeServerStream("\\\\.\\pipe\\SamplePipeSend1", System.IO.Pipes.PipeDirection.InOut, 4);
  
      sw1 = new StreamWriter("C:\\ServerEXE\\serverdataFile2.txt", true);
  
      sw1.Close();
  
      StreamReader sr = new StreamReader(pipeServer);
      StreamWriter sw = new StreamWriter(pipeServer);
  
      do
      {
          try
          {
              pipeServer.WaitForConnection();
              string test;
              sw.WriteLine("Waiting");
              sw.Flush();
              pipeServer.WaitForPipeDrain();
              test = sr.ReadLine();
              sw1 = new StreamWriter("C:\\ServerEXE\\serverdataFile2.txt",true);
              sw1.WriteLine(test);
              sw1.Close();
          }
  
          catch (Exception ex)
          { throw ex; }
  
          finally
          {
              pipeServer.WaitForPipeDrain();
              if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
          }
      } while (true);
  }
  </code></pre>
  
  <p>Server.EXE:</p>
  
  <pre><code>public static void Main()
  {
      PipeServer obj = new PipeServer();
      obj.server();
      Thread startserver = new Thread(new ThreadStart(obj.client));
      startserver.Start();
  }
  
  public void server()
  {
      System.IO.Pipes.NamedPipeServerStream pipeServer = new System.IO.Pipes.NamedPipeServerStream("\\\\.\\pipe\\SamplePipe1", System.IO.Pipes.PipeDirection.InOut, 4);
  
      StreamReader sr = new StreamReader(pipeServer);
      StreamWriter sw = new StreamWriter(pipeServer);
  
      do
      {
          try
          {
              pipeServer.WaitForConnection();
              string test;
              sw.WriteLine("Waiting");
              sw.Flush();
              pipeServer.WaitForPipeDrain();
              test = sr.ReadLine();
              Console.WriteLine(test);
          }
  
          catch (Exception ex)
          { throw ex; }
  
          finally
          {
              pipeServer.WaitForPipeDrain();
              if (pipeServer.IsConnected) { pipeServer.Disconnect(); }
          }
      } while (true);
  }
  
  public void client()
  {
      int cnt = 0;
      while (true)
      {
          System.IO.Pipes.NamedPipeClientStream pipeClient = new System.IO.Pipes.NamedPipeClientStream(".", "\\\\.\\pipe\\SamplePipeSend1", System.IO.Pipes.PipeDirection.InOut, System.IO.Pipes.PipeOptions.None);
  
          if (pipeClient.IsConnected != true) { pipeClient.Connect(); }
  
          StreamReader sr = new StreamReader(pipeClient);
          StreamWriter sw = new StreamWriter(pipeClient);
  
          string temp;
          temp = sr.ReadLine();
  
          if (temp == "Waiting")
          {
              try
              {
                  cnt++;
                  sw.WriteLine("clientSide Message " + cnt);
                  sw.Flush();
                  Thread.Sleep(10000);
  
              }
              catch (Exception ex) { throw ex; }
          }
          else
          {
              pipeClient.Close();
          }
      }
  }
  </code></pre>