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进程通 ...
随机推荐
- Proxmox Reset Root Password
http://c-nergy.be/blog/?p=1777 Step 1 – Boot your Proxmox VE machine. In the boot menu screen, you s ...
- 【NIFI】 实现数据库到数据库之间数据同步
本里需要基础知识:[NIFI] Apache NiFI 安装及简单的使用 数据同步 界面如下: 具体流程: 1.使用ExecuteSQL连接mysql数据库,通过写sql查询所需要的数据 2.nifi ...
- gcc 库路径里同时有相同文件名的动态库和静态库
找不到库的处理方案 有两种方法: 一.可以把当前路径加入 /etc/ld.so.conf中然后运行ldconfig,或者以当前路径为参数运行ldconfig(要有root权限才行). 二.把当前路径加 ...
- 3、iOS Xcode创建protocol(代理).h文件
- yum 安装报错:Could not retrieve mirrorlist http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stock error was 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error"
[root@venn09 ~]# yum install -y vim Loaded plugins: fastestmirror Could not retrieve mirrorlist http ...
- 2018.11.06 NOIP训练 简单的计数问题(计数dp)
传送门 直接f[i][j]f[i][j]f[i][j]表示已经到第iii个位置已经找到jjj个的方案数. 简单转移一下就行了. 代码
- tomat修改启动路径
https://blog.csdn.net/axela30w/article/details/76546735
- top k问题
1.top k问题 在海量数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最高的前k个数,或者从海量数据中找出最大的前k个数,这类问题通常被称为top K问题.例如,在搜索引擎中,统计搜索最 ...
- js获取浏览器类型进行判断
本文为webuploader.js中学习心得,感谢开源,从中加入了ie的edge判断 /** * @description 简单的浏览器检查结果. * * * `webkit` webkit版本号,如 ...
- leaflet入门(一)示例
代码示例: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...