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


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

原理

管道通信使用的是 Pipe 需要启动一对才可以

在 NamedPipeServerStream 启动之后可以接受其他 NamedPipeClientStream 连接。

因为现在已经使用了 await 了,所以建议全部都可以写异步。

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

            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的最佳实践

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

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

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

  2. IPC进程通信机制

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

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

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

  4. 【Chromium中文文档】跨进程通信 (IPC)

    跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...

  5. android跨进程通信(IPC)——AIDL

    转载请标明出处: http://blog.csdn.net/sinat_15877283/article/details/51026711: 本文出自: [温利东的博客] 近期在看 @任玉刚 大神编写 ...

  6. IPC进程之间通信的几种方式

    概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...

  7. 进程以及进程通信(IPC)类型

    这里用我有限的知识来解释同时参考了一些其他博主的子类,希望能给与一部分入门的朋友一个清晰的理解,有问题之处还请指出 首先简单谈一下什么是进程? 答:进程是装入内存运行的程序段,是许多的系统对象拥有权的 ...

  8. Android-Messenger跨进程通信

    http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler ...

  9. Linux之进程通信20160720

    好久没更新了,今天主要说一下Linux的进程通信,后续Linux方面的更新应该会变缓,因为最近在看Java和安卓方面的知识,后续会根据学习成果不断分享更新Java和安卓的方面的知识~ Linux进程通 ...

随机推荐

  1. ssh密钥讲解

    我们用ssh连接机器时候需要输用户名.密码,但是直接写账户文件的时候由于用的是明文,就存在安全的问题了.别人一旦截取了数据就获得了隐私了.这时候就用上ssh的密钥. ssh的密钥存是成对出现的,一个叫 ...

  2. Mockplus3.5.0.1新增标注功能

    Mockplus3.5.0.1版本中,新增了标注功能.多种标注模式,智能生成,随时查看.原型设计效率更高. Mockplus的标注功能有以下四种模式: 1.无选中标注 在未选中任何组件时,按住Ctrl ...

  3. oracle的常用99条语句

    1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...

  4. 金币(NOIP2015)

    先给题目:金币 又是很水的题,很简单,直接上代码: #include<bits/stdc++.h> using namespace std; int main(){ int n; scan ...

  5. 836. Rectangle Overlap

    class Solution { public: bool isRectangleOverlap(vector<int>& rec1, vector<int>& ...

  6. 2018.12.30 bzoj3028: 食物(生成函数)

    传送门 生成函数模板题. 我们直接把每种食物的生成函数列出来: 承德汉堡:1+x2+x4+...=11−x21+x^2+x^4+...=\frac 1{1-x^2}1+x2+x4+...=1−x21​ ...

  7. openstack之安全组管理

    命令概览 (nova-api)[root@cc07 /]# nova help|grep secgroup add-secgroup Add a Security Group to a server. ...

  8. 分布式的CAP理论

    CAP是强一致性.可用性(实时可用).分区容忍性: Consistency(一致性). Availability(可用性).Partition tolerance(分区容错性) 一般来说 P 是前提. ...

  9. printk()、查看开机log、查看实时log

    要将linux内核的带级别控制的printk内容打印出来,在命令行 输入 dmesg -n 8 就将所有级别的信息都打印出来 Linux命令:dmesg 功能说明:显示开机信息. 语 法:dmesg ...

  10. 一个简单的MySQL多实例环境搭建

    安装mysql 初始化两个数据库目录 mysql_install_db --datadir=/usr/local/var/mysql1 --user=mysql mysql_install_db -- ...