(原創)[.Net] 程式間通訊框架(基於共享記憶體)——SimpleMMF

leslie_xin發表於2021-08-06

一、前言

程式間通訊技術的應用非常廣泛,在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】-

相關文章