日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

监控自定义信息 —— ESFramework 4.0 快速上手(10)

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 监控自定义信息 —— 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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。