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,一经查实,立即删除!

相关文章

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;双十一背后的蚂蚁金服技术支持」活动。蚂蚁金服高级技术专家贾岛为大家分享了《亿级并发下的蚂蚁移动端到…

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

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

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;同时插件…

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;并…

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

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

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

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

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

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

tickcount()修改成小时分钟_银行核心系统24小时机制实现总结

本文共2268字 | 建议阅读时间&#xff1a;5分钟作者&#xff1a;张广在核心系统的设计实现中&#xff0c;24小时机制向来是一个重点难点。早期的银行只有柜面一个业务办理渠道&#xff0c;因此当时的综合业务系统&#xff0c;跟随网点的营业时间&#xff0c;分为日起&#xff0…

WBS结果输出表

目录​​​​​​​ 概述 模板 案例 扩展阅读 概述 花了很大力气分解的WBS&#xff0c;要趁热打铁&#xff0c;把每个活动落实到人。 模板 推荐一个模板 1&#xff1a;修改成项目名 2&#xff1a;填写项目基本信息 3&#xff1a;WBS的最底层工作包 4&#xff1a;工作…

svn管理工具_主流代码管理工具深度评测

引言 作为有十几年IT行业代码的从业人员&#xff0c;经历过代码管理工具的变迁&#xff0c;从早期的微软的Source Code Control&#xff0c;到TFS&#xff0c;再到SVN&#xff0c;再到现在的Git。我深知代码管理工具是代码开发过程中非常重要的工具。市场上的代码管理工具有很多…

我的2018

写在开始 2018年以飞快的速度临近尾声了&#xff0c;只感慨时间过得真快&#xff01; 这一年过得算是平平淡淡&#xff0c;没有比较特别的地方。 工作 从去年8月来到这公司&#xff0c;是个做旅游产品的互联网公司&#xff0c;平时里做的事可以说是很简单&#xff0c;我只能说&…

程序员笔试面试后上机_hcie面试有哪些要注意的事项?

大家都知道&#xff0c;华为认证hcie考试分为三个部分&#xff0c;分别是笔试、lab实验和面试。其中&#xff0c;考生讨论得最多的就是面试部分&#xff0c;因为面试不同于笔试和lab实验&#xff0c;自己埋头答题和操作就行&#xff0c;面试要面对考官&#xff0c;考核的东西非…

【Infragistics教程】在javascript构造函数中创建基本继承

2019独角兽企业重金招聘Python工程师标准>>> 【下载Infragistics Ultimate最新版本】 用javascript创建对象有四种方法。具体如下&#xff1a; 对象作为文本构造函数调用模式创建&#xff08;&#xff09;方法在ES6之后使用类继承的实现因对象创建方法而异。本文将解…

switch芯片和phy芯片的区别_感应式芯片卡CPU卡的FM1208-9和FM1208-10有什么区别,你知道吗?...

感应式CPU卡是目前芯片卡中安全系统较高的芯片&#xff0c;使用范围也较为广泛&#xff0c;但是这款CPU分为FM1208-9和FM1208-10&#xff0c;那你们知道分别代表什么意思呢&#xff1f;他们之间有什么不同呢&#xff1f;CPU白卡FM是什么&#xff1f;首先&#xff0c;我们来说下…