如何:使用命名管道通过网络在进程之间进行通信
下面的示例演示如何使用 NamedPipeClientStream 类创建命名管道。在此示例中,服务器进程创建了四个线程。每个线程可以接受一个客户端连接。连接的客户端进程随后向服务器提供一个文件名。如果客户端具有足够的权限,服务器进程就会打开文件并将其内容发送回客户端。
using System; using System.IO; using System.IO.Pipes; using System.Threading; class PipeServer { static int numThreads = 4; static void Main() { for (int i = 0; i < numThreads; i++) { Thread newThread = new Thread(new ThreadStart(ServerThread)); newThread.Start(); } Console.WriteLine("Press enter to exit."); Console.ReadLine(); } // Main() private static void ServerThread() { using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, numThreads)) { Console.WriteLine("NamedPipeServerStream thread created."); // Wait for a client to connect pipeServer.WaitForConnection(); Console.WriteLine("Client connected."); try { // Read the request from the client. Once the client has // written to the pipe its security token will be available. using (StreamReader sr = new StreamReader(pipeServer)) using (StreamWriter sw = new StreamWriter(pipeServer)) { sw.AutoFlush = true; // Verify our identity to the connected client using a // string that the client anticipates. sw.WriteLine("I am the true server!"); // Obtain the filename from the connected client. string filename = sr.ReadLine(); // Read in the contents of the file while impersonating // the client. ReadFileToStream fileReader = new ReadFileToStream(pipeServer, filename); // Display the name of the user we are impersonating. Console.WriteLine("Reading file: {0} as user {1}.", pipeServer.GetImpersonationUserName(), filename); pipeServer.RunAsClient(fileReader.Start); pipeServer.Disconnect(); } } // Catch the IOException that is raised if the pipe is broken // or disconnected. catch (IOException e) { Console.WriteLine("ERROR: {0}", e.Message); } } } // ServerThread() } // PipeServer class ReadFileToStream { private string m_filename; private Stream m_stream; public ReadFileToStream(Stream stream, string filename) { m_filename = filename; m_stream = stream; } // ReadFileToStream(stream, filename) public void Start() { using (StreamWriter sw = new StreamWriter(m_stream)) { string contents = File.ReadAllText(m_filename); sw.WriteLine(contents); sw.Flush(); } } // Start() } // ReadFileToStream
下面的示例演示使用 NamedPipeClientStream 类的客户端进程。客户端连接服务器进程并向服务器发送一个文件名。服务器随后将文件内容发送回客户端。文件内容随后显示在控制台上。
using System; using System.IO; using System.IO.Pipes; using System.Security.Principal; class PipeClient { static int numThreads = 4; static void Main() { using (NamedPipeClientStream pipeClient = new NamedPipeClientStream("localhost", "testpipe", PipeDirection.InOut, PipeOptions.None, TokenImpersonationLevel.Impersonation)) using (StreamWriter sw = new StreamWriter(pipeClient)) using (StreamReader sr = new StreamReader(pipeClient)) { sw.AutoFlush = true; pipeClient.Connect(); // Verify that this is the "true server" if (sr.ReadLine() == "I am the true server!") { // The client security token is sent with the first write. sw.WriteLine(@"c:\textfile.txt"); // Print the file to the screen. char[] buffer = new char[32]; int n; while ((n = sr.Read(buffer, 0, buffer.Length)) != 0) { Console.Write(buffer, 0, n); } } else { Console.WriteLine("Server could not be verified."); } } } // Main() }
浙公网安备 33010602011771号