首页 > 系统相关 >C# NamePipe 进程间通信

C# NamePipe 进程间通信

时间:2024-03-31 12:22:06浏览次数:14  
标签:string C# NamePipe 间通信 WriteLine new var using public

应答式进程间通信

全体

  • 应答式是指服务端开启管道连接并等待连接,客户端写入请求,服务端读取请求,处理后写入应答,客户端读取应答。最后关闭管道。
  • 通信数据为XML形式,写入管道前将对象XML序列化,读取时XML反序列化得到对象。
  • 使用XML的原因为.net版本较低,不使用第三方库则不支持JSON,不得以使用。虽然JSON使用更为方便。
  • 由于管道为最后关闭,所以服务端在读取请求时,不能读到最后,否则将继续等待客户端继续写入,而客户端并不再写入,最终服务端线程停留在等待客户端写入而阻塞。
  • 所以管道中的写入与读取时,使用WriteLine和ReadLine,每次只写一行,读一行。XML序列化时,取消掉所有的换行。
  • WriteLine方法中将字符串写入该流,后跟行结束符(换行符)。所以读取一行并没有读到末尾。

服务端

public class NPipeServer
{
    private const string pipeName = "MyPipe"; // 定义管道名称
    public void Start()
    {
        while (true)
        {
            try {
                using (var server = new NamedPipeServerStream(pipeName, PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous))
                {
                    Console.WriteLine("服务器已启动,等待连接...");
                    server.WaitForConnection();

                    using (StreamWriter writer = new StreamWriter(server))
                    using (StreamReader reader = new StreamReader(server))
                    {
                        string request = reader.ReadLine();

                        Console.WriteLine("收到客户端消息: " + request);

                        MyObject myObject = MyObject.DeserializeFromXml(request);

                        // 处理请求并准备应答
                        string response = ProcessRequest(request);

                        // 将应答写回给客户端
                        writer.WriteLine(response);
                        writer.Flush();
                    }
                }
            } catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            
        }

    }

    private static string ProcessRequest(string request)
    {
        // 在这里实现处理逻辑,比如计算、查询数据库等
        return $"已处理您的请求:{request},这里是应答...";
    }
}

客户端

    public class NPipeClient
    {
        private const string pipeName = "MyPipe";

        public void SendRequest(MyObject myObject)
        {
            try {
                using (var client = new NamedPipeClientStream(".", pipeName, PipeDirection.InOut))
                {
                    client.Connect(5000); // 等待最多5秒连接到服务器

                    using (StreamWriter writer = new StreamWriter(client))
                    using (StreamReader reader = new StreamReader(client))
                    {
                        // 发送请求
                        writer.WriteLine(myObject.SerializeToXml());
                        writer.Flush();

                        // 接收应答
                        string response = reader.ReadLine();
                        Console.WriteLine("从服务器接收到应答: " + response);
                    }
                }
            } catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }

        }
    }

通信数据

   [Serializable]
   public class MyObject
   {
       public string Msg { get; set; }
       public int Data { get; set; }

       public string SerializeToXml()
       {
           var serializer = new XmlSerializer(typeof(MyObject));
           var settings = new XmlWriterSettings
           {
               OmitXmlDeclaration = true,
               NewLineHandling = NewLineHandling.None,
               Encoding = Encoding.UTF8
           };

           XmlSerializerNamespaces _namespaces = new XmlSerializerNamespaces(
   new XmlQualifiedName[] {
                       new XmlQualifiedName(string.Empty, "aa")
});
           using (var stringWriter = new StringWriter())
           using (var xmlWriter = XmlWriter.Create(stringWriter, settings))
           {
               serializer.Serialize(xmlWriter, this, _namespaces);
               string xmlString = stringWriter.ToString().Replace(@"\r\n","").Replace(@"\n","");

               return xmlString;
           }
       }

       public static MyObject DeserializeFromXml(string xml)
       {
           var serializer = new XmlSerializer(typeof(MyObject));
           using (var textReader = new StringReader(xml))
           {
               return (MyObject)serializer.Deserialize(textReader);
           }
       }
   }

标签:string,C#,NamePipe,间通信,WriteLine,new,var,using,public
From: https://www.cnblogs.com/xs1987/p/18106573

相关文章

  • 操作系统概念-进程管理-同步互斥camproj
    操作系统概述操作系统定义:能有效的组织和管理系统中的各种软/硬件资源,合理的组织计算机系统工作流程,控制程序的执行,并且向用户提供一个良好的工作环境和友好的接口。操作系统有两个重要的作用:通过资源管理提高计算机系统的效率;改善人机界面向用户提供友好的工作环境。操......
  • CCF-CSP真题《202309-3 梯度求解》题解
    题目string转longlong忘记处理负数卡了半天,服了#include<iostream>#include<cstdio>#include<cstring>#include<sstream>typedeflonglongll;usingnamespacestd;intn,m,temp;lla[302];stringf,x,b;llmod=1e9+7;structnode{ stringcon; n......
  • 【博客708】victoriametrics如何处理counter跳变
    victoriametrics如何处理counter跳变背景监控中我们经常会使用一些counter类型的metrics来计算速率,比如:rate(https_request_total)但是如果我们的服务突然由于异常导致重启了,那么这时候counter会重新从0开始计算,那么这时候就会有问题,假设我们原来https_request_total是......
  • AcWing刷题-区间合并
    校门外的树区间合并:fromtypingimportListdefmerge(intervals:List[List[int]])->List[List[int]]:#按照第一个元素从小到大进行排序intervals.sort(key=lambdax:x[0])#初始化一个新的数组new_list=list()foriinintervals:......
  • AI绘画:利用ComfyUI进行文生图操作的完整指南
    前言ComfyUI作为一款基于StableDiffusion的节点式操作界面,为用户提供了一个更加灵活和高效的文生图(文本生成图像)创作环境。本篇博客将详细介绍如何使用ComfyUI进行文生图操作,无论你是初学者还是有一定基础的用户,都能够通过本指南快速上手。书接上文,香型大家已经完成了Stabll......
  • 矩阵匹配【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-矩阵匹配从一个NM(N<=M)的矩阵中选出N个数,任意两个数字不能在同一行或同一列,求选出来的N个数中第K大的数字的最小值是多少。输入描述:输入矩阵要求:1<=K<=N<=M<=150输入格式:NMKNM矩阵输出描述:N*M的矩阵中可以选出M!/N!种组合数组,每个组合数组中第K大的数中的......
  • 文本统计分析【华为OD机试JAVA&Python&C++&JS题解】
    一.题目-文本统计分析有一个文件,包含以一定规则写作的文本,请统计文件中包含的文本数量规则如下文本以";“分隔,最后一条可以没有”;",但空文本不能算语句,比如"COMMANDA;;"只能算一条语句.注意,无字符/空白字符/制表符都算作"空"文本文本可以跨行,比如下面,......
  • [ABC347C] Ideal Holidays题解
    [ABC347C]IdealHolidays题解原题传送门原题传送门(洛谷)​ 题意翻译:​ 在\(AtCoder\)王国中,一个周有\(A+B\)天。其中在一周中,\([1,A]\)天是假日,\([A+1,B]\)天是工作日。​ 高桥有\(N\)个计划,第\(i\)个计划安排在\(i\)天后。他不知道今天是周几,但他想知道是否......
  • 一些超级好用的CSS 属性
    1、fit-content盒子大小自适应内容案例:比如有时候我们需要根据给定的文本来调整盒子的宽度,这时候使用固定的宽度就很难调整,CSS提供的width:fit-content;2、透明色透明色的RGB值是(0,0,0,0),其中第四个参数表示透明度,取值范围是0到1。透明度为0表示完全透明,透明度为1表......
  • EF Core 显式跟踪实体
    显式跟踪实体项目2023/10/057个参与者反馈 本文内容介绍插入新实体附加现有实体更新现有实体删除现有实体删除依赖实体/子实体删除主实体/父实体使用TrackGraph进行自定义跟踪显示较少选项每个 DbContext 实例跟踪对实体所做的更改。在调用 Save......