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进程通 ...
随机推荐
- 工具类官网Web原型制作分享-Adobe
Adobe是全球知名的软件开发团队,研发了设计创意领域全球领先的优秀软件产品,为设计行业提供了巨大的价值. 网站原型以图文排版为主,顶部一级导航,弹出面板和面板的使用实现了一级导航下拉的效果. 本原型 ...
- Mac虚拟机
2018-06-21 需要的Mac静像是ios或是cdr的,如果是dmg,可以参考这个转换http://blog.sina.com.cn/s/blog_60b45f230101kkbf.html 或 ...
- CSS-弹性布局-动画-过渡
1.弹性布局 1.项目的属性 该组属性只能设置在某项目元素上,只控制一个项目,是不影响容器以及其他项目的效果. 1.order 作用:定义项目的排列顺序,值越小,越靠近起点,默认值是0 取值:整数数字 ...
- liunx基础命令
linux的简单介绍 linux是一款免费使用和自由传播的内似于unix的操作系统软件,是一个基于POSI和unix的多用户,多任务,支持多线程和多CPU的一种操作系统.主要用于服务器,特别是网络服务 ...
- Python开课复习-10/17
pickle是一个用来序列化的模块序列化是什么?指的是将内存中的数据结构转化为一种中间格式 并存储到硬盘上 反序列化?将硬盘上存储的中间格式数据在还原为内存中的数据结构 为什么要序列化?就是为了将数据 ...
- 爬取微博的数据时别人用的是FM.view方法传递html标签那么jsoup怎么解析呢
使用JSOUP就行 这里给出点思路 我只做了自己的首页和其他人的微博首页的抓取 其他的抓取没尝试(不好意思 比较懒...) 首先是利用JSOUP进行登陆 获取页面 看了下微博的登陆表格 发现用了aja ...
- 菜品识别 API调用
#get_access_token.py #获取access_token 1 import requests def GetToken(API_KEY,SECRET_KEY): url = 'http ...
- VC调试小结
本机调试F5: 开始调试Shift+F5: 停止调试F10: 调试到下一句,这里是单步跟踪 F11: 调试到下一句,跟进函数内部Shift+F11: 从当前函数中跳出F9: 设置(取消)断点Outpu ...
- UVaLive 3357 Pinary (Fib数列+递归)
题意:求第 k 个不含前导 0 和连续 1 的二进制串. 析:1,10,100,101,1000,...很容易发现长度为 i 的二进制串的个数正好就是Fib数列的第 i 个数,因为第 i 个也有子问题 ...
- Netty4.x 源码实战系列(一): 深入理解ServerBootstrap 与 Bootstrap
转载自:https://www.cnblogs.com/itdriver/p/8149913.html 从Java1.4开始, Java引入了non-blocking IO,简称NIO.NIO与传统s ...