title author date CreateTime categories
dot net core 使用 IPC 进程通信
lindexi
2018-08-10 19:16:52 +0800
2018-04-11 08:22:12 +0800
dnc 进程通信 IPC pipe

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

一般都是使用 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 实现通信

2018-8-10-dot-net-core-使用-IPC-进程通信的更多相关文章

  1. dot net core 使用 IPC 进程通信

    本文告诉大家如何使用dot net core 和其他进程进行通信 一般都是使用 WCF 或 remoting 做远程通信,但是 dot net core 不支持 WCF 所以暂时我就只能使用 管道通信 ...

  2. AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)

    首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...

  3. IPC进程通信机制

    select.poll.epoll之间的区别总结[整理] 进程间通信---共享内存 信号量和互斥锁的区别 http://www.2cto.com/os/201510/445553.html http: ...

  4. linux的IPC进程通信方式-匿名管道(一)

    linux的IPC进程通信-匿名管道 什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管道的真正定义是 ...

  5. 在ASP dot Net Core MVC中用Controllers调用你的Asp dotnet Core Web API 实现CRUD到远程数据库中,构建你的分布式应用(附Git地址)

    本文所有的东西都是在dot Net Core 1.1环境+VS2017保证测试通过. 本文接着上次文章接着写的,不了解上篇文章的可能看着有点吃力.我尽量让大家都能看懂.这是上篇文章的连接http:// ...

  6. 申请Office 365一年免费的开发者账号攻略(2018年10月份版本)

    要进行Office 365开发,当然需要有完整的Office 365环境才可以.为了便于广大开发人员快速地启动这项工作,微软官方给所有开发人员提供了免费的一年开发者账号   那么如何申请Office ...

  7. IntelliJ IDEA 最新激活码(截止到2018年10月14日)

    IntelliJ IDEA 注册码: EB101IWSWD-eyJsaWNlbnNlSWQiOiJFQjEwMUlXU1dEIiwibGljZW5zZWVOYW1lIjoibGFuIHl1IiwiYX ...

  8. 新手C#SQL Server使用记录2018.08.10

    主键(PrimaryKey):主键就是每个数据行(记录)的唯一标识,不会有重复值的列(字段)才能当做主键.一个表可以没有主键,但是这样会很难处理表,因此一般情况表都要设置主键. 主键有两张选用策略,分 ...

  9. 2017-2018-1 20155222 《信息安全系统设计基础》第10周 Linux下的IPC机制

    2017-2018-1 20155222 <信息安全系统设计基础>第10周 Linux下的IPC机制 IPC机制 在linux下的多个进程间的通信机制叫做IPC(Inter-Process ...

  10. 01 mybatis框架整体概况(2018.7.10)-

    01 mybatis框架整体概况(2018.7.10)- F:\廖雪峰 JavaEE 企业级分布式高级架构师课程\廖雪峰JavaEE一期\第一课(2018.7.10) maven用的是3.39的版本 ...

随机推荐

  1. 遇到的bug

    1  div出现莫名其妙的空白bug 之前写了一个后台管理系统,项目不小加上是改版,很多的js都是用的之前的,  bug多到自己都不想看, 其中有个是用iframe 框架加载表格页面,但是右边跟下边出 ...

  2. Effective Modern C++:08调整

    41:针对可复制的形参,在移动成本低且一定会被复制的前提下,考虑将其按值传递 class Widget { public: void addName(const std::string& ne ...

  3. ThinkPHP5.0中报错could not find driver的解决方式

    这个报错是我的tp5项目转移到另外的服务器中发生的错误, 其中报错信息中还包含这pdo等字眼 解决方法:在php.ini中开启php_pdp_mysql.dll

  4. Function相关的小知识

      重载 相同函数名,不同参数列表的多个函数,在调用时可自动根据传入参数的不同,选择对应的函数执行.为什么使用重载:                   减轻API的名字,减轻调用者的负担.何时使用重 ...

  5. Permutations II 去掉重复的全排列

    Given a collection of numbers that might contain duplicates, return all possible unique permutations ...

  6. 【JZOJ4787】【NOIP2016提高A组模拟9.17】数格子

    题目描述 输入 输出 样例输入 1 10000 3 10000 5 10000 0 0 样例输出 1 11 95 数据范围 每个测试点数据组数不超过10组 解法 状态压缩动态规划. 设f[i][j]表 ...

  7. Intellij IDEA通过tomcat部署web项目的机制

    问题 以前使用eclipse调用tomcat运行web项目时,eclipse的方式非常直接了当,就是直接将项目更新到%TOMCAT_HOME%/webapps目录下即可.然而在使用Intellij I ...

  8. 【JZOJ4883】【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    题目描述 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取一些原子,排成 ...

  9. 2019-8-31-dotnet-使用-System.CommandLine-写命令行程序

    title author date CreateTime categories dotnet 使用 System.CommandLine 写命令行程序 lindexi 2019-08-31 16:55 ...

  10. myeclipse2013在线安装svn

    之前安装svn一直不行.弄了好久.还是在线安装方便. 在Help里面点击Install from Site,然后直接图解: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkb ...