C# 使用匿名管道进行本地进程间通信

目录

写在前面

代码实现

客户端进程

服务端进程

调用示例


写在前面

相对于命名管道通讯方式而言,匿名管道开销更小,更轻松便捷;缺点就是无法进行网络通讯,只能在本机使用,应用场景相对狭窄;适合于本地多进程之间的通讯,比如主节点和多个从节点之间的交互。

以下代码实现主要来自微软官网,实现了采用匿名管道将字符串从父进程发送到子进程的功能。

代码实现

客户端进程

cs 复制代码
using System;
using System.IO;
using System.IO.Pipes;

class PipeClient
{
    static void Main(string[] args)
    {
        if (args.Length > 0)
        {
            // 指定为接收端: PipeDirection.In 
            using PipeStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In, args[0]);
            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();
    }
}

服务端进程

cs 复制代码
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";

        // 指定为发送端:PipeDirection.Out
        using AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable);
        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.");
        
        Console.ReadLine();
    }
}

调用示例

需要注意的是除了客户端的exe和dll,配置文件PipeClient.runtimeconfig.json也需要一并放入服务端的运行目录。

相关推荐
小白学大数据7 分钟前
如何避免爬虫因Cookie过期导致登录失效
开发语言·爬虫·python·scrapy
爱吃烤鸡翅的酸菜鱼1 小时前
【SpringMVC】概念引入与连接
java·开发语言·mysql
小白学大数据1 小时前
Python自动化解决滑块验证码的最佳实践
开发语言·python·自动化
碎梦归途1 小时前
23种设计模式-行为型模式之策略模式(Java版本)
java·开发语言·jvm·设计模式·策略模式·行为型模式
Albert Edison1 小时前
Python入门基础
开发语言·python
小余吃大鱼1 小时前
OpenStack私有云详细介绍
开发语言·php·openstack
画个大饼1 小时前
Swift:什么是Optional?其背后的机制是什么?什么是Unconditional Unwrapping?
开发语言·ios·swift
T0uken1 小时前
【Python】Matplotlib:立体永生花绘制
开发语言·python·matplotlib
sniper_fandc1 小时前
JVM(Java虚拟机)详解
java·开发语言·jvm
雾削木1 小时前
mAh 与 Wh:电量单位的深度解析
开发语言·c++·单片机·嵌入式硬件·算法·电脑