2012-12-10 16 views
103

Jak napisać proste - absolutne minimum potrzebne do jego działania - aplikacja testowa ilustrująca sposób korzystania z IPC/potoków nazwanych?Przykład nazwanych potoków

Na przykład, w jaki sposób można by napisać aplikację konsoli, w którym Program 1 mówi „Hello World” do Programu 2 i Program 2 odbiera wiadomość i odpowiedzi „Zrozumiałem” do programu 1.

Odpowiedz

130
using System; 
using System.IO; 
using System.IO.Pipes; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      StartServer(); 
      Task.Delay(1000).Wait(); 


      //Client 
      var client = new NamedPipeClientStream("PipesOfPiece"); 
      client.Connect(); 
      StreamReader reader = new StreamReader(client); 
      StreamWriter writer = new StreamWriter(client); 

      while (true) 
      { 
       string input = Console.ReadLine(); 
       if (String.IsNullOrEmpty(input)) break; 
       writer.WriteLine(input); 
       writer.Flush(); 
       Console.WriteLine(reader.ReadLine()); 
      } 
     } 

     static void StartServer() 
     { 
      Task.Factory.StartNew(() => 
      { 
       var server = new NamedPipeServerStream("PipesOfPiece"); 
       server.WaitForConnection(); 
       StreamReader reader = new StreamReader(server); 
       StreamWriter writer = new StreamWriter(server); 
       while (true) 
       { 
        var line = reader.ReadLine(); 
        writer.WriteLine(String.Join("", line.Reverse())); 
        writer.Flush(); 
       } 
      }); 
     } 
    } 
} 
+0

prostu zastanawiasz się, co Line: 16 ma być, bo nie ma definicji „opóźnienie” w System.Thread .Tasks –

+1

@JordanTrainor Przepraszamy, jest w .Net 4.5. Możesz użyć 'Thread.Sleep' –

+0

Użycie Zadania w tym przykładzie jest bardzo poważne. Jest to pełna składnia i ze względu na harmonogram może nie być nawet blisko 1000 ms. – Gusdor

17

dla kogoś, kto jest nowy w IPC i Named Pipes, znalazłem następujący pakiet NuGet, który jest świetną pomocą.

GitHub: Named Pipe Wrapper for .NET 4.0

Aby użyć najpierw zainstalować pakiet:

PS> Install-Package NamedPipeWrapper 

Następnie serwer Przykład (skopiowany z link):

var server = new NamedPipeServer<SomeClass>("MyServerPipe"); 
server.ClientConnected += delegate(NamedPipeConnection<SomeClass> conn) 
    { 
     Console.WriteLine("Client {0} is now connected!", conn.Id); 
     conn.PushMessage(new SomeClass { Text: "Welcome!" }); 
    }; 

server.ClientMessage += delegate(NamedPipeConnection<SomeClass> conn, SomeClass message) 
    { 
     Console.WriteLine("Client {0} says: {1}", conn.Id, message.Text); 
    }; 

server.Start(); 

przykład klient:

var client = new NamedPipeClient<SomeClass>("MyServerPipe"); 
client.ServerMessage += delegate(NamedPipeConnection<SomeClass> conn, SomeClass message) 
    { 
     Console.WriteLine("Server says: {0}", message.Text); 
    }; 

client.Start(); 

Najlepsze dla mnie jest to, że w przeciwieństwie do zaakceptowanej odpowiedzi obsługuje wielu klientów rozmawiających z jednym serwerem.

+2

Nie polecam tego pakietu NuGet do produkcji. Zaimplementowałem go i ma kilka błędów, głównie z powodu niemożności naprawdę poznania, kiedy wiadomość została w pełni odebrana na drugim końcu potoku (prowadzi do zerwania połączenia lub zakończenia połączenia zbyt wcześnie (sprawdź kod na github, jeśli mi nie ufasz, "WaitForPipeDrain" nie jest wywoływany, kiedy powinien), a będziesz miał wielu klientów, nawet jeśli tylko jeden nasłuchi, ponieważ ... zbyt wiele problemów). To smutne, ponieważ było naprawdę łatwe w użyciu. Musiałem odbudować jeden od zera z mniejszymi opcjami. –

+0

Tak, niestety, oryginalny opiekun nie aktualizował projektu przez lata, na szczęście chociaż istnieje wiele widelców, z których większość rozwiązuje problemy, które omówiliście. –

10

W rzeczywistości można pisać do nazwanego potoku za pomocą jego nazwy, btw.

Otwórz powłokę poleceń jako administrator, aby ominąć domyślny „Odmowa dostępu” błąd:

echo Hello > \\.\pipe\PipeName 
Powiązane problemy