C# 程序间通信之管道通信

科技   2024-10-07 12:57   上海  

在 C# 中,管道通信是一种有效的进程间通信(IPC)机制。管道允许两个进程进行数据交换,可以是匿名管道,也可以是命名管道。匿名管道通常用于父子进程间的通信,而命名管道则适用于不同进程间的通信,甚至可以跨网络使用。

1. 命名管道

命名管道提供了一种持久化的通信方式,客户端和服务器可以通过一个命名的管道实例进行通信。

服务器端示例代码

csharp

using System;
using System.IO.Pipes;
using System.Text;

public class NamedPipeServer
{
public static void Main()
{
using (NamedPipeServerStream pipeServer = new NamedPipeServerStream("testpipe", PipeDirection.InOut, 1, PipeTransmissionMode.Byte, PipeOptions.Asynchronous))
{
Console
.WriteLine("Waiting for client connection...");
pipeServer
.WaitForConnection();

Console
.WriteLine("Client connected.");
byte[] buffer = new byte[256];
int bytesRead = pipeServer.Read(buffer, 0, buffer.Length);
string messageFromClient = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console
.WriteLine("Received: " + messageFromClient);

// Send response back to client
string response = "Hello from server";
pipeServer
.Write(Encoding.UTF8.GetBytes(response), 0, response.Length);
pipeServer
.Flush();
}
}
}

客户端示例代码

csharp

using System;
using System.IO.Pipes;
using System.Text;

public class NamedPipeClient
{
public static void Main()
{
using (NamedPipeClientStream pipeClient = new NamedPipeClientStream(".", "testpipe", PipeDirection.InOut, PipeOptions.Asynchronous))
{
Console
.WriteLine("Connecting to server...");
pipeClient
.Connect();

Console
.WriteLine("Sending message to server...");
string messageToSend = "Hello from client";
pipeClient
.Write(Encoding.UTF8.GetBytes(messageToSend), 0, messageToSend.Length);
pipeClient
.Flush();

// Read response from server
byte[] buffer = new byte[256];
int bytesRead = pipeClient.Read(buffer, 0, buffer.Length);
string messageFromServer = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console
.WriteLine("Received: " + messageFromServer);
}
}
}

2. 匿名管道

匿名管道通常用于父子进程间的通信。

父进程示例代码

csharp

using System;
using System.IO.Pipes;

public class ParentProcess
{
public static void Main()
{
using (AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out))
{
using (AnonymousPipeClientStream pipeClient = new AnonymousPipeClientStream(pipeServer.GetClientHandleAsString()))
{
Console
.WriteLine("Writing to child...");
string message = "Hello from parent";
byte[] buffer = Encoding.UTF8.GetBytes(message);
pipeServer
.Write(buffer, 0, buffer.Length);
pipeServer
.Flush();
}
}
}
}

子进程示例代码

csharp

using System;
using System.IO.Pipes;

public class ChildProcess
{
public static void Main(string[] args)
{
using (AnonymousPipeClientStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In, args[0]))
{
byte[] buffer = new byte[256];
int bytesRead = pipeClient.Read(buffer, 0, buffer.Length);
string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
Console
.WriteLine("Received: " + message);
}
}
}

3. 管道通信的注意事项

  • 确保管道的权限和安全设置正确,以防止未授权访问。

  • 对于命名管道,确保管道名称唯一,避免冲突。

  • 在使用匿名管道时,通常需要父进程创建管道并启动子进程。

  • 处理管道断开和异常情况,确保资源得到释放。

结论

管道通信是 C# 中进程间通信的有效方式。通过使用命名管道和匿名管道,开发者可以在不同的进程之间传递数据。正确使用管道通信可以提高应用程序的模块化和可扩展性。

往期精品推荐:

在国内默默无闻的.NET,在国外火的超乎想象?

C#的膨胀之路:创新还是灭亡

介绍.NET 6款好看的winform开源UI库

介绍一款最受欢迎的.NET 开源UI库

WPF第三方开源UI框架:打造独特体验的魔法师

WPF与Winform,你的选择是?

WinForm的前世今生

.NET成年了,然后呢?——编程界的逆袭传奇

CSharp编程大全
C#编程.net core开发,winform桌面开发,wpf开发,c sharp编程大全,CSharp程序开发,C#开发实例(附源代码),编程过程遇到的各种坑详解!
 最新文章