2012-12-10 57 views
103

IPC /名前付きパイプの使用方法を示す作業用テストアプリケーションには、単純な最小限の方法で書く方法を教えてください。名前付きパイプの例

例えば、どのように1は、プログラム1がプログラム2への「Hello World」とプログラム2は、誰かのために1

答えて

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

ジャストラインが何を思って:

デフォルトを回避するには、管理者としてコマンドシェルを開き、エラーが「アクセスが拒否されました」 .Tasks –

+1

@JordanTrainor申し訳ありませんが、それは.Net 4.5です。あなたは 'Thread.Sleep'を使うことができます –

+0

この例でのTaskの使用はかなり悲惨です。冗長な構文であり、スケジューリングが1000msにも達しないこともあるためです。 – Gusdor

17

をプログラムにメッセージと返信「それロジャー」を受け取ると言うコンソールアプリケーションを記述しますIPCとNamed Pipesには新しく、次のNuGetパッケージが大きな助けになることが判明しました。そして

PS> Install-Package NamedPipeWrapper 

(リンクからコピーされた)、例えばサーバ:パッケージインストール最初に使用する

GitHub: Named Pipe Wrapper for .NET 4.0

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(); 

例をクライアント:

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

client.Start(); 

私にとって最善のことは、ここで受け入れられている回答とは異なり、複数のクライアントが単一のサーバーと通信することをサポートしていることです。

+2

生産用にこのNuGetパッケージをお勧めしません。私はそれを実装しましたが、いくつかのバグがあります。これは主に、メッセージがパイプの他端で完全に受信されたことを本当に知ることができないためです(接続が壊れたり、接続が早すぎますあなたが私を信用していない場合、 "WaitForPipeDrain"は呼び出されません)、1つだけ聞いていても複数のクライアントを持つことになります。それは本当に使いやすいので悲しいです。オプションを少なくしてゼロから再構築する必要がありました。 –

+0

はい、良い点ですが、残念ながら元のメンテナーは何年もプロジェクトを更新していませんでした。 –

10

実際には、名前がbtwの名前付きパイプに書き込むことができます。何の定義は「遅延」のためありませんので、16 System.Threadにすることになっている:

echo Hello > \\.\pipe\PipeName 
関連する問題