8

(原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF

 3 years ago
source link: https://www.cnblogs.com/lesliexin/p/15106309.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

(原创)[.Net] 进程间通信框架(基于共享内存)——SimpleMMF

进程间通信技术的应用非常广泛,在Windows下常用的实现方式有:管道、Socket、消息、本地文件、共享内存等,每种方式都有各自适应的场景。

在进行大数据交换时,最优的方式便是共享内存。

但是共享内存在应用时往往需要配合其他的进程间通信方式,比如管道、消息等,用以通知共享内存中的数据发生了改变,所以共享内存在实际应用时是很繁琐的。

本框架——SimpleMMF,便是为解决这个痛点所开发的。本框架完全基于共享内存实现。

SimpleMMF的使用非常简单:实例化完毕后,响应事件即可,事件中会附带共享内存中的数据;需要向共享内存中写入数据时,调用一个方法即可。

SimpleMMF已经开源:
Github:https://github.com/lesliexinxin/LeslieXin.SimpleMMF

相信看完的你,一定会有所收获!

本文地址:https://www.cnblogs.com/lesliexin/p/15106309.html


二、使用示例

(一)流程

1,整体流程

image

2,程序说明

服务端:DemoServer.exe。
作用:读取由客户端写入共享内存中的数据,并对数据进行处理,然后再次写入共享内存。
客户端:DemoClient.exe。
作用:往共享内存写数据,并从共享内存中读取修改后的数据,

(二)实现

1,获取框架并添加引用。

可以从Github中直接获取release,并手动添加dll引用。

image

2,服务端

(1)外观设计

image

(2)代码实现

(2.1)以服务端方式实例化。

image

(2.2)实现ServerMsg事件。

(注:以服务端方式实例化时,只会触发ServerMsg事件,所以只能响应ServerMsg事件;同理,以客户端方式实例化时,只会触发ClientMsg事件,所以只能响应ClientMsg事件。)

image

3,客户端

(1)外观设计

image

(2)代码实现

(2.1)以客户端方式实例化。

image

(2.2)实现ClientMsg事件。

(注:以服务端方式实例化时,只会触发ServerMsg事件,所以只能响应ServerMsg事件;同理,以客户端方式实例化时,只会触发ClientMsg事件,所以只能响应ClientMsg事件。)

获取共享内存数据,并显示。取到的数据会包含客户端实例化时的clientName,可以通过此值判断当前共享内存中的数据是否是当前客户端程序所需要的。

image

(2.3)写入数据

在文本框内容发生改变时,将文本内容写入共享内存。

image

(三)演示

image


三、实现原理

SimpleMMF在实例化时会分配3个共享内存:STATE、VALUE、CLIENT。如图所示:

image

SimpleMMF在实例化后,会一直遍历STATE的值,当STATE的值不等0时,进行下一步的处理:
STATE的值等1,代表着有服务端写入了数据,读取此数据,并触发ClientMsg事件。
STATE的值等2,代表着有客户端写入了数据,读取些数据,并触发ServerMsg事件,

在客户端写入数据时,除了向VALUE中写入数据外,还会向CLIENT中写入当前客户端的名称。用于在响应ClientMsg事件时,判断是哪个客户端写入的数据。

具体流程如下:

image


SimpleMMF的实现并不复杂,但是在实现后,使用起来却非常的简单方便,极大的提高了开发效率。

SimpleMMF是基于.Net4.5实现的,如果需要调整为更早的.Net版本,下面提供下修改思路:
1,.Net4.0:修改事件ServerMsg、ClientMsg的定义方式,使用传统的事件定义方式重新定义即可。
2,.Net4.0之前版本:修改读取共享内存、写入共享内存方法,需要用到Win32的相关API函数去读写共享内存。

感谢观看,欢迎大家评论指正。


-【END】-


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK