监控自定义信息 —— ESFramework 4.0 快速上手(10)
????? 在ESFramework 4.0 進階(02)-- 核心:消息處理的骨架流程一文中,我們介紹了通過掛接IMessageSpy到骨架流程,我們就可以監控到所有收發的消息。由于Rapid引擎已經為我們組裝好了默認的骨架流程,如果使用Rapid引擎,我們就無法插入自定義的IMessageSpy。不過沒關系,使用Rapid引擎的我們同樣可以在服務端監控到客戶端發出的所有自定義信息。
?
一.深入ICustomizeInfoOutter接口
我們已經非常熟悉ICustomizeInfoOutter接口了,客戶端要發送任何自定義的信息,都是通過該接口來進行的。
??? public?interface?ICustomizeInfoOutter?:IOutter????{
????????///?<summary>
????????///?向服務器發送二進制信息。
????????///?</summary>
????????void?Send(int?informationType,?byte[]?info);
????????///?<summary>
????????///?向服務器提交請求信息,并返回服務器的應答信息。如果超時沒有應答則將拋出Timeout異常。
????????///?</summary>??????
????????///?<param?name="informationType">自定義請求信息的類型</param>
??????? byte[]?CommitRequest(int?informationType,?byte[]?info);
????????///?<summary>
????????///?向在線目標用戶提交請求信息,并返回應答信息。如果目標用戶不在線,或超時沒有應答則將拋出Timeout異常。
????????///?</summary>??????
??????? byte[]?CommitP2PRequest(string?targetUserID,?int?informationType,?byte[]?info);
????????///?<summary>
????????///?向在線用戶targetUserID發送二進制信息。如果目標用戶不在線,則服務端會調用ICustomizeInfoBusinessHandler.OnTransmitFailed方法來通知應用程序。
????????///?</summary>
??????? void?Send(string?targetUserID,?int?informationType,?byte[]?info);??????
????????///?<summary>
????????///?向目標組內所有在線用戶廣播二進制信息。(服務端采用Post)
????????///?</summary>
????????void?BroadcastInGroup(string?groupID,?int?informationType,?byte[]?info);
????}
????? 該接口的所有方法可以分為兩類:一類方法是接收自定義信息的最終用戶是服務端;另一類是接收自定義信息的最終用戶是其他在線用戶。無論是哪種情況,信息都會到達服務端,或由服務端處理、或經服務端轉發。(如果客戶端之間開啟了P2P通道,則另當別論。)所以,在服務端是可以監控到客戶端通過ICustomizeInfoOutter接口發出的所有自定義信息的。
????? 另外,關于同步調用服務端(CommitRequest方法)或同步調用其它客戶端(CommitP2PRequest),所發出的自定義信息也是如此,而且同步調用其它客戶端時的返回信息也是經過服務器轉發的,所以,也可以被監控到。
?
二.截獲自定義信息
????? 在服務端,我們可以預定ICustomizeInfoController接口的InformationReceived事件,來截獲客戶端發出的所有自定義信息。
?? event?CbGeneric<Information>?InformationReceived;(1)當收到來自客戶端的任何自定義信息時,將觸發該事件。要特別注意的是,該事件的處理函數不能拋出異常,否則將導致后續消息處理流程中斷。所以,最好在該事件的處理函數中catch所有的異常。
(2)該事件處理函數應盡快返回。因為服務端只有在所有的事件函數執行完畢后,才會繼續后續的消息處理流程,所以該事件處理函數返回得越快越好。如果有些處理函數的業務邏輯復雜,比較費時,可以考慮使用異步的方式。
(3)ICustomizeInfoOutter接口發出的所有自定義信息都包含了相同幾個方面的內容:自定義信息的類型、自定義信息的數據、信息的接收者。ESPlus使用Information類來封裝這些內容,并且增加了SourceID屬性以記錄發送者的UserID。InformationReceived事件只有一個Information類型參數。
????public?class?Information????{
????????#region?SourceID
????????private?string?sourceID?=?"";
????????///?<summary>
????????///?信息的發送者。可以為UserID或者NetServer.SystemUserID。
????????///?</summary>
????????public?string?SourceID
????????{
????????????get?{?return?sourceID;?}
????????????set?{?sourceID?=?value;?}
????????}?
????????#endregion
????????#region?DestID
????????private?string?destID?=?"";
????????///?<summary>
????????///?信息的接收者。可以為UserID或者NetServer.SystemUserID或GroupID(廣播消息)。
????????///?</summary>
????????public?string?DestID
????????{
????????????get?{?return?destID;?}
????????????set?{?destID?=?value;?}
????????}?
????????#endregion
????????#region?InformationType
????????private?int?informationType?=?0;
????????///?<summary>
????????///?自定義信息類型
????????///?</summary>
????????public?int?InformationType
????????{
????????????get?{?return?informationType;?}
????????????set?{?informationType?=?value;?}
????????}?
????????#endregion
????????#region?Content
????????private?byte[]?content?=?null;
????????///?<summary>
????????///?信息的內容
????????///?</summary>
????????public?byte[]?Content
????????{
????????????get?{?return?content;?}
????????????set?{?content?=?value;?}
????????}?
????????#endregion
????}
????? 注意,如果自定義信息的接收者為服務端,則DestID屬性的值是NetServer.SystemUserID(即?"_0")。
(4)當預定了InformationReceived事件后,我們可以根據InformationType來篩選那些我們感興趣的自定義信息,并對它們做一些記錄或其它業務處理。
?
三.更多說明
????? 服務端通過預定ICustomizeInfoController接口的InformationReceived事件,只能監控到客戶端由ICustomizeInfoOutter接口發出的自定義信息,而不能監控到其它命名空間下的Outter接口發送的消息(注意這里的用詞是消息,“自定義信息”特用于ESPlus.Application.CustomizeInfo空間),比如客戶端通過IBasicOutter接口發出的消息,在服務端是不會觸發InformationReceived事件的,它們屬于不同的命名空間,是相互獨立的。
????? 服務端如果要得到更多的通知,比如用戶上下線,就可以通過預定IUserManager接口的相關事件來做到。
????? 如果,你所用的版本的ICustomizeInfoController接口沒有InformationReceived事件,請到ESFramework 4.0 概述文末下載最新版本。
?
ESFramework 4.0 概述
《ESFramework 4.0 快速上手》系列所有文章
《ESFramework 4.0 高級進階》系列所有文章
?
?
轉載于:https://www.cnblogs.com/zhuweisky/archive/2011/04/14/2016024.html
總結
以上是生活随笔為你收集整理的监控自定义信息 —— ESFramework 4.0 快速上手(10)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目-团队-技术-个人(专业篇)
- 下一篇: HDU 1867 KMP