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进程通 ...
随机推荐
- mysql 清空所有表数据重置自增ID
1.登录mysql客户端 mysql -u root -p 输入密码进入 2.生成 sql 语句文件 SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') i ...
- c++11 初始化列表 bind function 示例
// 111111111111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #incl ...
- mybatis 操作数据错误Truncated incorrect DOUBLE value: ''
网上查到遇到次错误造成的原因: UPDATE TSYS_ROLE_RIGHTSET ACTIVE_FLAG = '2' and UPDATE_PERSON = 'CaiYiHua' and UPDA ...
- response设置编码格式
response设置编码的三种方式 在java后台的Action代码或者Servlet代码中用response的方法来设置输出内容的编码方式,有以下三个方法: 1.response.setCharac ...
- PHP删除空格函数
删除空格或其他字符的相关函数 ltrim函数 描述:实现删除字符串开始位置的空格或其他字符 语法:string ltrim(string $str [,string $charlist]) 说明:ch ...
- PHP可变函数
可变函数是指如果一个变量名后有圆括号,PHP将寻找与变量的值同名的函数,并尝试执行它 可变函数可以用来实现包括回调函数,函数表在内的用途 $str = 'strtolower'; echo $str( ...
- rails 查看项目的所有路由
rails routes
- Codeforces 1111 简要题解
文章目录 A题 B题 C题 D题 E题 传送门 A题 传送门 题意简述:把262626个英文字母分成两类A,BA,BA,B,AAA类字符可以转成AAA类字符,BBB类字符可以转成BBB类字符,问给出的 ...
- (5)How to let go of being a "good" person — and become a better person
https://www.ted.com/talks/dolly_chugh_how_to_let_go_of_being_a_good_person_and_become_a_better_perso ...
- java Concurrent包学习笔记(三):ReentrantLock
一.可重入性的理解 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大.两者都是同一个线程每进入一次,锁 ...