现在的位置: 首页 > 综合 > 正文

如何:使用匿名管道在本地进程之间进行通信(C#)

2018年02月14日 ⁄ 综合 ⁄ 共 4005字 ⁄ 字号 评论关闭

 

匿名管道提供的功能比命名管道少,但它需要的系统开销也少。
您可以使用匿名管道更加轻松地在本地计算机上进行进程间通信。
不能使用匿名管道通过网络进行通信。

示例


下面的示例演示使用匿名管道将字符串从父进程发送到子进程的方式。
此示例使用
Out

PipeDirection
值在父进程中创建一个
AnonymousPipeServerStream
对象。
然后,父进程通过使用客户端句柄创建一个
AnonymousPipeClientStream
对象来创建一个子进程。
该子进程的
In
值为
PipeDirection

然后,父进程将用户提供的字符串发送给子进程。
该字符串将显示在子进程中的控制台上。

下面的示例演示服务器进程。

using System;

using System.IO;

using System.IO.Pipes;

using System.Diagnostics;

 

class PipeServer

{

   
static
void Main()

   
{

       
Process pipeClient =
new Process();

 

       
pipeClient.StartInfo.FileName =
"pipeClient.exe";

 

       
using (AnonymousPipeServerStream pipeServer =

           
new AnonymousPipeServerStream(PipeDirection.Out,

           
HandleInheritability.Inheritable))

       
{

           
// Show that anonymous pipes do not support Message mode.

           
try

           
{

               
Console.WriteLine(
"[SERVER] Setting ReadMode to \"Message\".");

               
pipeServer.ReadMode = PipeTransmissionMode.Message;

           
}

           
catch (NotSupportedException e)

           
{

               
Console.WriteLine(
"[SERVER] Exception:\n   
{0}"
, e.Message);

           
}

 

           
Console.WriteLine(
"[SERVER] Current TransmissionMode: {0}.",

               
pipeServer.TransmissionMode);

 

           
// Pass the client process a handle to the server.

           
pipeClient.StartInfo.Arguments =

               
pipeServer.GetClientHandleAsString();

           
pipeClient.StartInfo.UseShellExecute =
false;

           
pipeClient.Start();

 

           
pipeServer.DisposeLocalCopyOfClientHandle();

 

           
try

           
{

               
// Read user input and send that to the client process.

               
using (StreamWriter sw =
new StreamWriter(pipeServer))

               
{

                   
sw.AutoFlush =
true;

                   
// Send a 'sync message' and wait for client to receive it.

                   
sw.WriteLine(
"SYNC");

                   
pipeServer.WaitForPipeDrain();

                   
// Send the console input to the client process.

                   
Console.Write(
"[SERVER] Enter text: ");

                   
sw.WriteLine(Console.ReadLine());

               
}

           
}

           
// Catch the IOException that is raised if the pipe is broken

           
// or disconnected.

           
catch (IOException e)

           
{

               
Console.WriteLine(
"[SERVER] Error: {0}", e.Message);

           
}

       
}

 

       
pipeClient.WaitForExit();

       
pipeClient.Close();

       
Console.WriteLine(
"[SERVER] Client quit. Server terminating.");

   
}

}

 

 

下面的示例演示客户端进程。
服务器进程启动客户端进程,并为该进程提供一个客户端句柄。
应该将从客户端代码得到的可执行文件命名为
pipeClient.exe
并在运行该服务器进程之前将其复制到服务器可执行文件所在的目录中。

using System;

using System.IO;

using System.IO.Pipes;

 

class PipeClient

{

   
static
void Main(string[]
args)

   
{

       
if (args.Length > 0)

       
{

           
using (PipeStream pipeClient =

               
new AnonymousPipeClientStream(PipeDirection.In, args[0]))

           
{

               
// Show that anonymous Pipes do not support Message mode.

               
try

  
             {

                   
Console.WriteLine(
"[CLIENT] Setting ReadMode to \"Message\".");

                   
pipeClient.ReadMode = PipeTransmissionMode.Message;

               
}

               
catch (NotSupportedException e)

               
{

                   
Console.WriteLine(
"[CLIENT] Execption:\n   
{0}"
, e.Message);

               
}

 

               
Console.WriteLine(
"[CLIENT] Current TransmissionMode: {0}.",

                  
pipeClient.TransmissionMode);

 

               
using (StreamReader sr =
new StreamReader(pipeClient))

               
{

                   
// Display the read text to the console

                   
string temp;

 

                   
// Wait for 'sync message' from the server.

                   
do

              
     {

                       
Console.WriteLine(
"[CLIENT] Wait for sync...");

                       
temp = sr.ReadLine();

                   
}

                   
while (!temp.StartsWith("SYNC"));

 

                   
// Read the server data and echo to the console.

                   
while ((temp = sr.ReadLine()) !=
null)

                   
{

                       
Console.WriteLine(
"[CLIENT] Echo: " + temp);

                   
}

               
}

           
}

  
     }

       
Console.Write(
"[CLIENT] Press Enter to continue...");

       
Console.ReadLine();

   
}

}

抱歉!评论已关闭.