dot net core 使用 IPC 进程通信

原文:dot net core 使用 IPC 进程通信

版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问。如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问博客。本文地址 https://blog.csdn.net/lindexi_gd/article/details/79946496

dot net core 使用 IPC 进程通信

本文告诉大家如何使用dot net core 和其他进程进行通信。

文章目录

  • dot net core 使用 IPC 进程通信
    • 原理
    • 例子
    • 序列化

一般都是使用 WCF 或 remoting 做远程通信,但是 dot net core 不支持 WCF 所以暂时我就只能使用 管道通信。

原理

管道通信使用的是 Pipe 需要启动一对服务器和客户端才可以使用。在 NamedPipeServerStream 启动之后可以接受其他 NamedPipeClientStream 连接。

因为现在已经使用了 await 了,所以建议全部都可以写异步,古老的程序员喜欢使用回调,但是现在的程序员还是建议使用 await 比较好,因为比较容易用。

创建的 NamedPipeServerStream 需要告诉管道的命名,和通信方式,通信可以分为单向和双向,大家使用枚举去看一下就可以知道。我来创建一个管道名是lindexi,可以双向通信的管道。

            var pipe = new NamedPipeServerStream("lindexi", PipeDirection.InOut);

上面代码就创建了一个管道,之后需要等待有连接才可以发送数据。

            await pipe.WaitForConnectionAsync();

等待了连接之后,就可以发送数据,发生的数据使用的是字节发送,所以需要转换编码。

            string str = "发送消息";var spxnfSrxldhhv = Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);

注意,需要指定发送数据的长度和数据,通过这个方法发送是不建议的。

如果需要使用一个比较高级的方法传输,请看文章最后

这时另一个程序就需要下面代码连接

            var pipe = new NamedPipeClientStream(".", "lindexi", PipeDirection.InOut, PipeOptions.None);pipe.Connect()

上面代码使用的 NamedPipeClientStream 需要指定管道的命名才可以找到。

连接之后可以通过这个方式读取数据

            var spxnfSrxldhhv = new byte[65535];var n = pipe.Read(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);var str = Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);

对于读写数据很多时候就使用 pipe 的读写,写入字节,读出字节。

因为一次读取可能会卡很多时间,所以建议使用异步读。

如果觉得每次发送都需要转 byte 然后进行写,代码很多,可以使用下面的代码

            var stream = new StreamWriter(pipe);stream.Write("发送消息");stream.Flush();

注意不要使用下面的代码

            using (var stream = new StreamWriter(pipe)){stream.Write("发送消息");}

原因是 using 会关闭 pipe 所以使用之后就不能在写。

例子

首先创建两个程序,一个是 WPF 程序 DgvlzKixtdin ,另一个是 dot net core 控制台 HclkvyDanuiag 。接着需要从 DgvlzKixtdin 发送数据,从 HclkvyDanuiag 接收数据。

在 WPF 程序添加一个 TextBlock 和 Button ,点击 Button 就发送消息到 dot net core 程序。收到消息就在 TextBlock 显示。

在 Button 点击的代码写下面代码

      private async void HixKkikjgp_OnClick(object sender, RoutedEventArgs e){var pipe = new NamedPipeServerStream("lindexi", PipeDirection.InOut);await pipe.WaitForConnectionAsync();string str = "发送消息";var spxnfSrxldhhv = Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);spxnfSrxldhhv = new byte[100];var n = pipe.Read(spxnfSrxldhhv, 0, 100);str = Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);TjdsguhmKzj.Text = str;}

然后在 dot net core 程序写下面代码

        static void Main(string[] args){Console.WriteLine("Hello World!");var pipe = new NamedPipeClientStream(".", "lindexi", PipeDirection.InOut, PipeOptions.None);pipe.Connect();var spxnfSrxldhhv = new byte[65535];var n = pipe.Read(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);var str = Encoding.UTF8.GetString(spxnfSrxldhhv, 0, n);Console.WriteLine(str);str = "收到";spxnfSrxldhhv = Encoding.UTF8.GetBytes(str);pipe.Write(spxnfSrxldhhv, 0, spxnfSrxldhhv.Length);Console.Read();}

先启动 WPF 程序,然后启动控制台

在这里插入图片描述

这时点击按钮之后就打开控制台可以看到控制台可以收到消息

在这里插入图片描述

然后 WPF 也收到控制台发过来的消息

在这里插入图片描述

序列化

虽然使用StreamWriter可以减少写入读取的代码,但是实际上这样只能用来传字符串,需要把类传输还是比较难,所以我找到了 Protobuf ,使用这个库可以简单使用。

首先打开 Nuget 安装 Protobuf 第一个

我这里使用 protobuf-net

然后创建一个类用来传输

    [ProtoContract]public class TyfxxTlkbjn{public string DczSwdsun { get; set; }}

使用下面代码可以进行写入

Serializer.Serialize(pipe, 实例);

所以修改一下上面的按钮按下

        {var pipe = new NamedPipeServerStream("lindexi", PipeDirection.InOut);await pipe.WaitForConnectionAsync();var tyfxxTlkbjn = new TyfxxTlkbjn(){DczSwdsun = "发送消息"};Serializer.Serialize(pipe, tyfxxTlkbjn);pipe.Disconnect();

修改 dot net core的代码

        static void Main(string[] args){var pipe = new NamedPipeClientStream(".", "lindexi", PipeDirection.InOut, PipeOptions.None);pipe.Connect();var tyfxxTlkbjn = Serializer.Deserialize<TyfxxTlkbjn>(pipe);Console.WriteLine(tyfxxTlkbjn.DczSwdsun);Console.Read();}

如果使用 wcf 请看 .NET Core调用WCF的最佳实践

如果需要使用 grpc 请看.net core grpc 实现通信

我搭建了自己的博客 https://lindexi.gitee.io/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python可变类型和不可变深浅拷贝类型_python3笔记十四:python可变与不可变数据类型+深浅拷贝...

一&#xff1a;学习内容python3中六种数据类型python赋值python浅拷贝python深拷贝二&#xff1a;python3六种数据类型1.六种数据类型Number(数字)string(字符串)List(列表)Tuple(元祖)Set(集合)Dictionary(字典)2.六种数据类型分类不可变数据(3个)&#xff1a;Number、String、…

Android手机用wifi连接adb调试的方法

https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android开发肯定要连接pc的adb进行调试&#xff0c;传统的方法是用usb与pc进行连接&#xff0c;操作简单即插即用&#xff0c;缺点是pc上必须得有对应手机的usb驱动程序&#xff0c;对于谷歌亲儿子系列和三星摩托等外国品牌而…

控制台应用程序换换为窗体应用_Epic为开发者设计了一套iPhone使用的运动捕捉应用程序...

玩懂手机网7月13日资讯&#xff0c;我们都知道对于游戏或者是动漫开发者来说&#xff0c;运动捕捉设备是一套非常昂贵的设备&#xff0c;需要非常专业的独立开发人员&#xff0c;大量的时间才能完成&#xff0c;最近Epic为开发者设计了一套iPhone使用的运动捕捉应用程序。这套i…

蚂蚁金服亿级并发下的移动端到端网络接入架构解析

为了与金融从业者、科技从业者共同探讨金融 业务的深层次问题&#xff0c;蚂蚁金服联手 TGO 鲲鹏会上海分会&#xff0c;在 12 月 8 日举办了「走进蚂蚁金服&#xff1a;双十一背后的蚂蚁金服技术支持」活动。蚂蚁金服高级技术专家贾岛为大家分享了《亿级并发下的蚂蚁移动端到…

python3.12答案_编程常见问题

通常&#xff0c;不要使用 from modulename import * 。这样做会使导入器的命名空间变得混乱&#xff0c;并且使得连接器更难以检测未定义的名称。在文件的顶部导入模块。这样做可以清楚地了解代码所需的其他模块&#xff0c;并避免了模块名称是否在范围内的问题。每行导入一个…

如何根据视频的宽屏与竖屏来排序?

原理 宽屏与竖屏是根据 帧高度 与 帧宽度 来区分的 帧高度就是图片高度&#xff08;纵向的像素尺寸&#xff09;&#xff0c;帧宽度就是图片宽度&#xff08;横向的像素尺寸&#xff09;&#xff0c;分辨率就是&#xff08;高度x宽度&#xff09;。 windows11的文件排序&…

HashiCorp Vault 1.0开源自动解封特性,新增Batch令牌

HashiCorp发布了其秘密管理工具Vault 的1.0版本&#xff0c;并开源了在发生故障或重启后继续使用Vault服务器所需的“自动解封&#xff08;auto-unseal&#xff09;”特性。这个版本提供了一种可以用于临时工作负载的新令牌batch。另一个新特性是&#xff0c;Kubernetes auth现…

sap模块介绍_小迈说|SAP究竟有多少模块?

SAP究竟有哪些模块继上一期小迈说SAP&#xff01;SPA&#xff1f;的区别&#xff0c;相信大部分读者明白了我们与水浴按摩行业的分别&#xff0c;可是仅仅区分名字还不够&#xff0c;SAP还有众多的模块&#xff0c;这些又该怎么去了解呢&#xff1f;这就轮到肩负爱与责任的小迈…

360 再次开源管理平台 Wayne:基于企业级 Kubernetes 集群

2019独角兽企业重金招聘Python工程师标准>>> 奇虎 360 宣布正式开源 Wayne &#xff0c;这是一个由 360 搜索云平台团队开发的通用的、基于 Web 的 Kubernetes 多集群一站式可视化管理平台。内置了丰富多样的功能&#xff0c;满足企业的通用需求&#xff0c;同时插件…

python setup.py install 出错_python setup.py install 失败

python setup&period;py install 报错ImportError&colon; No module named setuptools学习光荣之路python课程时,使用python setup.py install安装其他模块时,第一次安装某模块成功了.安装另一模块却报错ImportError: No module named s ...对于python setup&perio…

Node.js 根本没有这样搞性能优化的?

1、使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升&#xff0c;因为几乎任何新版本的 Node.js 都会比老版本性能更好&#xff0c;为什么&#xff1f; Node.js 每个版本的性能提升主要来自于两个方面&#xff1a; V8 的版本更新&#xff1b;Nod…

可交付成果、核实的可交付成果、验收的可交付成果?

①可交付成果。指的是在某一过程、阶段或项目完成时&#xff0c;产出的任何独特并可核实的产品、成果或服务。可交付成果可能是有形的&#xff0c;也可能是无形的。【研发完成】 ②核实的可交付成果。是指已经完成&#xff0c;并经过“控制质量”过程检查为正确的可交付成果。…

安装oracle到create inventory时卡住了怎么办_win10系统安装教程(官方工具)

Hi&#xff0c;大家好。对于小白用户&#xff0c;装系统是比较头疼的事&#xff0c;所以今天写一个简单易懂的装系统教程。使用微软官方提供的工具制作U盘启动盘&#xff0c;操作简单&#xff0c;系统纯净&#xff0c;强烈建议小白用户使用。缺点是该工具功能单一&#xff0c;并…

Microsoft Project 排计划的步骤

Microsoft Project 排计划的步骤&#xff1a; 第一步&#xff1a;设置项目信息&#xff0c;开始日期&#xff0c;选择日历&#xff1b; 第二步&#xff1a;编制WBS 第三步&#xff1a;设置前置任务 第四步&#xff1a;设置WBS每个工期 第五步&#xff1a;设置资源名称&#xff…

自建CDN Xnign产品指标

Xnign-X1 Xnign-X1 性能参数参考值L7 HTTP RPS &#xff08;128并发请求&#xff09;250W QPSL7 HTTP CPS &#xff08;128并发请求&#xff09;110W QPSL7 HTTP RPS &#xff08;100W并发请求&#xff09;180W QPSL7 HTTP CPS &#xff08;100W并发请求&#xff09;60W QPSL7 …

python表达式的值是 y 和n是什么意思_python中^是什么意思

展开全部在Python" // "表示整数除法。Python其它表达式e69da5e887aa3231313335323631343130323136353331333431353432&#xff1a;Python的表达式写法与C/C类似。只是在某些写法有所差别。主要的算术运算符与C/C类似。, -, *, /, //, **, ~, %分别表示加法或者取正、…

Linux的启动流程简析(以Debian为例)

Linux的启动流程简析(以Debian为例) 正文&#xff1a;前面的文章探讨BIOS和主引导记录的作用。那篇文章不涉及操作系统&#xff0c;只与主板的板载程序有关。今天&#xff0c;我想接着往下写&#xff0c;探讨操作系统接管硬件以后发生的事情&#xff0c;也就是操作系统的启动流…

一阶电路中的时间常数_精确移相电路的设计举例

移相电路就是对输入信号(一般是正弦波)进行相位控制&#xff0c;而不改变其幅度&#xff0c;本推文以移相电路为例&#xff0c;展示模拟电路的反馈设计技巧与方法&#xff1a;一、全通滤波器实现移相以上是两种移相电路 的原理&#xff0c;其输出幅度保持不变&#xff0c;移动的…

工作绩效数据、工作绩效信息、工作绩效报告

目录 概念 举例 概念 工作绩效数据&#xff1a;观察&#xff0c;测量&#xff0c;采集到的原始数据 工作绩效信息&#xff1a;对“工作绩效数据”进行加工分析 工作绩效报告&#xff1a;对“工作绩效信息”进行白话 举例 以去健身房为例 1&#xff09;工作绩效数据&…