(原創)[.Net] 進程間通信框架(基於共享內存)——SimpleMMF
一、前言
進程間通信技術的應用非常廣泛,在Windows下常用的實現方式有:管道、Socket、消息、本地文件、共享內存等,每種方式都有各自適應的場景。
在進行大數據交換時,最優的方式便是共享內存。
但是共享內存在應用時往往需要配合其他的進程間通信方式,比如管道、消息等,用以通知共享內存中的數據發生了改變,所以共享內存在實際應用時是很繁瑣的。
本框架——SimpleMMF,便是為解決這個痛點所開發的。本框架完全基於共享內存實現。
SimpleMMF的使用非常簡單:實例化完畢後,響應事件即可,事件中會附帶共享內存中的數據;需要向共享內存中寫入數據時,調用一個方法即可。
SimpleMMF已經開源:
Github://github.com/lesliexinxin/LeslieXin.SimpleMMF
相信看完的你,一定會有所收穫!
本文地址://www.cnblogs.com/lesliexin/p/15106309.html
二、使用示例
(一)流程
1,整體流程
2,程序說明
服務端:DemoServer.exe。
作用:讀取由客戶端寫入共享內存中的數據,並對數據進行處理,然後再次寫入共享內存。
客戶端:DemoClient.exe。
作用:往共享內存寫數據,並從共享內存中讀取修改後的數據,
(二)實現
1,獲取框架並添加引用。
可以從Github中直接獲取release,並手動添加dll引用。
2,服務端
(1)外觀設計
(2)代碼實現
(2.1)以服務端方式實例化。
(2.2)實現ServerMsg事件。
(註:以服務端方式實例化時,只會觸發ServerMsg事件,所以只能響應ServerMsg事件;同理,以客戶端方式實例化時,只會觸發ClientMsg事件,所以只能響應ClientMsg事件。)
3,客戶端
(1)外觀設計
(2)代碼實現
(2.1)以客戶端方式實例化。
(2.2)實現ClientMsg事件。
(註:以服務端方式實例化時,只會觸發ServerMsg事件,所以只能響應ServerMsg事件;同理,以客戶端方式實例化時,只會觸發ClientMsg事件,所以只能響應ClientMsg事件。)
獲取共享內存數據,並顯示。取到的數據會包含客戶端實例化時的clientName,可以通過此值判斷當前共享內存中的數據是否是當前客戶端程序所需要的。
(2.3)寫入數據
在文本框內容發生改變時,將文本內容寫入共享內存。
(三)演示
三、實現原理
SimpleMMF在實例化時會分配3個共享內存:STATE、VALUE、CLIENT。如圖所示:
SimpleMMF在實例化後,會一直遍歷STATE的值,當STATE的值不等0時,進行下一步的處理:
STATE的值等1,代表着有服務端寫入了數據,讀取此數據,並觸發ClientMsg事件。
STATE的值等2,代表着有客戶端寫入了數據,讀取些數據,並觸發ServerMsg事件,
在客戶端寫入數據時,除了向VALUE中寫入數據外,還會向CLIENT中寫入當前客戶端的名稱。用於在響應ClientMsg事件時,判斷是哪個客戶端寫入的數據。
具體流程如下:
四、總結
SimpleMMF的實現並不複雜,但是在實現後,使用起來卻非常的簡單方便,極大的提高了開發效率。
SimpleMMF是基於.Net4.5實現的,如果需要調整為更早的.Net版本,下面提供下修改思路:
1,.Net4.0:修改事件ServerMsg、ClientMsg的定義方式,使用傳統的事件定義方式重新定義即可。
2,.Net4.0之前版本:修改讀取共享內存、寫入共享內存方法,需要用到Win32的相關API函數去讀寫共享內存。
感謝觀看,歡迎大家評論指正。
-【END】-