dot net core 使用 IPC 进程通信
本文告诉大家如何使用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 进程通信的更多相关文章
- AIDL/IPC Android AIDL/IPC 进程通信机制——超具体解说及使用方法案例剖析(播放器)
首先引申下AIDL.什么是AIDL呢?IPC? ------ Designing a Remote Interface Using AIDL 通常情况下,我们在同一进程内会使用Binder.Broad ...
- IPC进程通信机制
select.poll.epoll之间的区别总结[整理] 进程间通信---共享内存 信号量和互斥锁的区别 http://www.2cto.com/os/201510/445553.html http: ...
- linux的IPC进程通信方式-匿名管道(一)
linux的IPC进程通信-匿名管道 什么是管道 如果你使用过Linux的命令,那么对于管道这个名词你一定不会感觉到陌生,因为我们通常通过符号"|"来使用管道,但是管道的真正定义是 ...
- 【Chromium中文文档】跨进程通信 (IPC)
跨进程通信 (IPC) 转载请注明出处:https://ahangchen.gitbooks.io/chromium_doc_zh/content/zh//General_Architecture/I ...
- android跨进程通信(IPC)——AIDL
转载请标明出处: http://blog.csdn.net/sinat_15877283/article/details/51026711: 本文出自: [温利东的博客] 近期在看 @任玉刚 大神编写 ...
- IPC进程之间通信的几种方式
概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是 ...
- 进程以及进程通信(IPC)类型
这里用我有限的知识来解释同时参考了一些其他博主的子类,希望能给与一部分入门的朋友一个清晰的理解,有问题之处还请指出 首先简单谈一下什么是进程? 答:进程是装入内存运行的程序段,是许多的系统对象拥有权的 ...
- Android-Messenger跨进程通信
http://blog.csdn.net/lmj623565791/article/details/47017485 一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler ...
- Linux之进程通信20160720
好久没更新了,今天主要说一下Linux的进程通信,后续Linux方面的更新应该会变缓,因为最近在看Java和安卓方面的知识,后续会根据学习成果不断分享更新Java和安卓的方面的知识~ Linux进程通 ...
随机推荐
- IOS语法
2017-07-15 NSDictionary里要用到的类型转换 [NSNumber numberWithInt: 89] 2017-12-10 定义一个Block的写法 typedef void ...
- MVVM模式理解
MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自 ...
- 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...
- 清幽傲竹实现的kbmMWServer数据库联接失败重联(转载红鱼儿)
1.修改kbmMWUnidac单元的TkbmMWUNIDACConnection.InternalOpenConnection方法,加上: //支持unidac重联 ...
- oracle compile 编译无效对象
原博主:http://blog.csdn.net/tianlesoftware/article/details/4843600 Applies to: Oracle Server - Enterpri ...
- 更改Ubuntu默认python版本的两种方法python-> Anaconda
当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.一般Ubuntu默认的Python版本都为2. ...
- UVa 11077 Find the Permutations (计数DP)
题意:给定 n 和 m,问你在 1 ~ n 的所有排列中,有多少个排列满足至少要交换 m 次才能变成 1 2 3 ... n. 析:首先,先考虑一下,某个排列,要变成 1 2 3 .. n,最少要交换 ...
- springMVC注解(一)Controller
HelloWorld程序 Step1 编写web.xml文件 <?xml version="1.0" encoding="UTF-8"?> < ...
- bzoj2002(lct模板)
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #inclu ...
- java基础-day14
第01天 java面向对象 今日内容介绍 u 接口 u 匿名对象&final u 多态 第1章 接口 1.1 接口的概述 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的 ...