命名pipe道的例子
我该如何编写一个简单的工具 – testing应用程序,说明如何使用IPC /命名pipe道?
例如,如何编写一个控制台应用程序,其中程序1向程序2发送“Hello World”,程序2收到消息并向程序1回复“Roger That”。
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(); } }); } } }
对于一个刚接触IPC和命名pipe道的人,我发现以下NuGet包是一个很好的帮助。
GitHub:.NET 4.0命名pipe道包装器
要使用先安装软件包:
PS> Install-Package NamedPipeWrapper
然后一个示例服务器(从链接复制):
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();
对我来说最好的事情就是不同于这里接受的答案,它支持多个客户端与单个服务器交谈。
实际上你可以使用它的名字写一个命名pipe道,顺便说一句。
以pipe理员身份打开一个命令shell,以解决默认的“访问被拒绝”错误:
echo Hello > \\.\pipe\PipeName