跳转到主要内容

进程通信

PIPE管道通信
 // 管道服务器类
 public class PipeServer
 {
     private readonly string _pipeName;
     private readonly PipeDirection _direction;
     private readonly int _maxInstances;
     private readonly PipeTransmissionMode _transmissionMode;
     private readonly PipeOptions _options;

     public event EventHandler<string> MessageReceived;

     public PipeServer(string pipeName, PipeDirection direction, int maxInstances, PipeTransmissionMode transmissionMode, PipeOptions options)
     {
         _pipeName = pipeName;
         _direction = direction;
         _maxInstances = maxInstances;
         _transmissionMode = transmissionMode;
         _options = options;
     }

     // 启动管道服务器
     public void Start()
     {
         Task.Run(() => ListenForClients());
     }

     // 监听客户端连接
     private async Task ListenForClients()
     {
         while (true)
         {
             using (var namedPipeServerStream = new NamedPipeServerStream(_pipeName, _direction, _maxInstances, _transmissionMode, _options))
             {
                 try
                 {
                     await namedPipeServerStream.WaitForConnectionAsync();
                     Console.WriteLine("进程连接管道");

                     // 读取客户端发送的进程名称
                     byte[] nameBytes = new byte[1024];
                     int nameBytesRead = await namedPipeServerStream.ReadAsync(nameBytes, 0, nameBytes.Length);
                     string processName = Encoding.UTF8.GetString(nameBytes, 0, nameBytesRead);
                     Console.WriteLine($"连接的进程名称: {processName}");

                     // 持续读取客户端发送的消息
                     while (namedPipeServerStream.IsConnected)
                     {
                         byte[] bytes = new byte[1024];
                         int bytesRead = await namedPipeServerStream.ReadAsync(bytes, 0, bytes.Length);
                         if (bytesRead > 0)
                         {
                             string msg = Encoding.UTF8.GetString(bytes, 0, bytesRead);
                             Console.WriteLine($"进程: {msg}");
                             OnMessageReceived(msg);
                         }
                     }
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine($"错误: {ex.Message}");
                 }
             }
         }
     }

     // 触发消息接收事件
     protected virtual void OnMessageReceived(string message)
     {
         MessageReceived?.Invoke(this, message);
     }
 }
    // 管道服务器构建器类
    public class PipeServerBuilder
    {
        private string _pipeName;
        private PipeDirection _direction;
        private int _maxInstances;
        private PipeTransmissionMode _transmissionMode;
        private PipeOptions _options;

        // 设置管道名称
        public PipeServerBuilder WithPipeName(string pipeName)
        {
            _pipeName = pipeName;
            return this;
        }

        // 设置管道方向
        public PipeServerBuilder WithDirection(PipeDirection direction)
        {
            _direction = direction;
            return this;
        }

        // 设置最大实例数
        public PipeServerBuilder WithMaxInstances(int maxInstances)
        {
            _maxInstances = maxInstances;
            return this;
        }

        // 设置传输模式
        public PipeServerBuilder WithTransmissionMode(PipeTransmissionMode transmissionMode)
        {
            _transmissionMode = transmissionMode;
            return this;
        }

        // 设置管道选项
        public PipeServerBuilder WithOptions(PipeOptions options)
        {
            _options = options;
            return this;
        }

        // 构建管道服务器
        public PipeServer Build()
        {
            return new PipeServer(_pipeName, _direction, _maxInstances, _transmissionMode, _options);
        }
    }
public class PipeClient
{
    private readonly string _pipeName;
    private NamedPipeClientStream _namedPipeClientStream;

    public event EventHandler<string> MessageToSend;

    public PipeClient(string pipeName)
    {
        _pipeName = pipeName;
    }

    public async Task StartAsync()
    {
        string processName = Process.GetCurrentProcess().ProcessName;

        _namedPipeClientStream = new NamedPipeClientStream(".", _pipeName, PipeDirection.InOut, PipeOptions.Asynchronous);
        try
        {
            await _namedPipeClientStream.ConnectAsync();
            Console.WriteLine("已连接到管道服务器");

            // 发送进程名称
            byte[] nameBytes = Encoding.UTF8.GetBytes(processName);
            await _namedPipeClientStream.WriteAsync(nameBytes, 0, nameBytes.Length);
            await _namedPipeClientStream.FlushAsync();

            // 订阅消息发送事件
            MessageToSend += async (sender, message) =>
            {
                byte[] messageBytes = Encoding.UTF8.GetBytes(message);
                await _namedPipeClientStream.WriteAsync(messageBytes, 0, messageBytes.Length);
                await _namedPipeClientStream.FlushAsync();
            };

            Console.WriteLine("客户端已启动,等待发送消息...");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"错误: {ex.Message}");
        }
    }

    public void SendMessage(string message)
    {
        MessageToSend?.Invoke(this, message);
    }
}
  // 创建并配置管道服务器
  var pipeServer = new PipeServerBuilder()
      .WithPipeName("mypipe")
      .WithDirection(PipeDirection.InOut)
      .WithMaxInstances(NamedPipeServerStream.MaxAllowedServerInstances)
      .WithTransmissionMode(PipeTransmissionMode.Byte)
      .WithOptions(PipeOptions.Asynchronous)
      .Build();
  // 启动管道服务器
  pipeServer.Start();
// 创建并启动客户端
var pipeClient = new PipeClient("mypipe");
await pipeClient.StartAsync();

// 发送不同的消息
while (true)
{
    string message = Console.ReadLine();
    pipeClient.SendMessage(message);
}