什么是動態組?舉個例子就清楚了。QQ支持多人在一個組中聊天的模式是群,這是一種靜態組;而MSN中的動態的將多個人拉到一個組中來群聊,就是動態組。關于動態組,還有一個很好的例子,就是多人聯網游戲,比如聯網的星際。首先由發起者創建一個組(動態組),然后其它玩家加入進來開始游戲,游戲結束了,該動態組就銷毀了。所以說,動態組是個“臨時性的”,生命比較短暫;而靜態組,通常被存儲于永久介質(如數據庫)中,即使這場游戲結束,這個組依然存在,如。
ESFramework對靜態組的支持是“好友管理器”――IFriendManager(存在于ESFramework V0.1+),而對動態組的支持主要是ESFramework.Network.ActiveGroup(存在于ESFramework V0.2+)命名空間。
在服務器運行的過程中,可能需要創建成百上千的動態組,所有這些動態組需要被管理起來,這個管理者就是IActiveGroupManager。動態組管理器主要有以下職責:
(1)根據請求創建/銷毀動態組。
(2)將某用戶加入到某動態組。
(3)將某用戶從動態組中移除。
(4)將組消息在指定的組內廣播。
(5)查詢所有動態組的消息。
根據上述職責描述,可以定義IActiveGroupManager接口:
2 {
3 bool CreateGroup( string creator, string groupName); // 如果有同名的group存在、則返回false
4 bool DestroyGroup( string userID, string groupName); // 如果無權刪除、則返回false
5
6 JoinGroupResultJoinGroup( string userID, string groupName);
7 void DropoutFromGroup( string userID, string groupName);
8 void BroadcastMessage( string sourceUserID, string destGroupName,NetMessagemsg); // 在目標組內廣播消息
9
10 ICollectionGroups{ get ;}
11 bool CreatorOwner{ set ;} // 如果為true,表示只有創建者才有權DestroyGroup
12 IToClientSenderToClientSender{ set ;}
13 }
14
15 public enum JoinGroupResult
16 {
17 Succeed,GroupIsNotExist,MaxSized
18 }
CreatorOwner屬性表明是否只有組的創建者才有權銷毀組。ESFramework中IActiveGroupManager接口的參考實現是ActiveGroupManager。IActiveGroupManager管理的對象是動態組,那么動態組的定義了、它有哪些職責:
(1)管理組內所有用戶,支持用戶加入組、從組中撤出。
(2)維護組的最大容量。如果當前Size已經達到最大容量,則無法再加入用戶
(3)當組為空時,觸發GroupEmptied事件。應用可以處理該事件,比如從管理器中刪除對應的組。
動態組接口IActiveGroup定義如下:
2 {
3 string Creator{ get ;} // 創建者
4 string GroupName{ get ;}
5 int Count{ get ;}
6 int MaxSize{ get ; set ;}
7
8 IListUserList{ get ;}
9
10 bool AddUser( string userID); // 當達到MaxSize時,返回false
11 void RemoveUser( string userID);
12
13 event CbSimpleGroupEmptied;
14 }
ESFramework中IActiveGroup接口的參考實現是EsbActiveGroup。
為了能處理來自客戶端的動態組請求/消息,我們先要能區分它,我們消息類型枚舉中增加定義:
2 {
3 Basic, // IBasicRequestDealer
4 Function,
5 P2PMessage, // 對于P2P消息,服務器僅僅轉發,P2PMessageDealer
6 FriendRelation, // 如好友列表、好友資料等,FriendRelationDealer
7 GroupMessage , // 如多人聯網游戲中的同步消息等
8 CustomServiceType // 自定義服務種類
9 }
接著,對于GroupMessage這個大類,我們需要進一步細分:
{
Create, // 需要回復-創建是否成功
Destroy, // 需要回復-銷毀是否成功
Join, // 需要回復-加入是否成功
DropoutFromGroup, // 不需要回復
Broadcast // 如游戲同步消息,不需要回復
}
為了使ESFramework能一致的處理所有的GroupMessage,我們設定了IActiveGroupMessage接口,所有的GroupMessage都可以轉換到這個接口:
/// IGroupMessageActiveGroup消息的基礎接口,所有的組消息協議都要實現此接口。
/// zhuweisky2006.04.06
/// </summary>
public interface IActiveGroupMessage
{
string GroupName{ get ;}
ActiveGroupMessageTypeActiveGroupMessageType{ get ;}
}
另外,我們需要一個幫手來實現這個轉換:
{
IActiveGroupMessageParseGroupMessage(NetMessagemsg);
}
好了,一切就緒了,我們只差一個對應的消息處理器來處理所有的GroupMessage,這個消息處理器就是ActiveGroupMessageDealer,它借助于IActiveGroupManager實現了對所有GroupMessage的處理,下面給出它的實現源碼:

最后,我們將ActiveGroupMessageDealer處理器添加到默認的處理器工廠EsbRequestDealerFactory中。(代碼略)
說明一下,ActiveGroup的命名空間是ESFramework.Network.ActiveGroup,表明其與協議是無關的,即它可以用于Tcp協議,也可以用于Udp協議。
感謝關注!
上一篇文章:
ESFramework介紹之(18)―― Tcp用戶管理器組件
轉到:
ESFramework 可復用的通信框架(序)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
