ESFramework 4.0 快速上手(06) -- Rapid引擎(续)

时间:2021-12-03 03:53:17

《ESFramework 4.0 快速上手》系列介绍的都是如何使用Rapid引擎(快速引擎) -- RapidServerEngine 和 RapidPassiveEngine。其实,大家可以将这两个引擎看作是两个壳,内部包装的才是真正的ESFramework的网络引擎, ESFramework支持很多种网络引擎(客户端/服务端、二进制协议/文本协议、TCP/UDP),而RapidServerEngine和RapidPassiveEngine采用的是基于TCP和二进制协议的服务端引擎和客户端引擎。这两个壳存在的目的,就是使大家不用了解ESFramework内部机制,就可以非常快速的上手ESFramework应用开发。但是,限制也是有的,那就是Rapid引擎仅仅使用了ESFramework最基础的功能,还有很多重要的功能,就不好通过Rapid引擎体现出来了。当然,通过复杂的封装,也可以做到全部体现,但是那样的话,Rapid引擎的上手就不是那么容易了,Rapid就不"Rapid"了。

  尽管如此,对于一些简单的应用,Rapid引擎已经足够应付了。在这里,我再补充一些为了更好地使用Rapid引擎时需要了解的一些信息。

1. 对称性

ESPlus.Application命名空间下的组件用于协助我们快速地开发ESFramework应用程序,并且对服务端和客户端都提供了支持。比如,,对于上面提到的自定义信息的支持,就是ESPlus.Application.CustomizeInfo命名空间做的事情,其下包含两个子命名空间:ESPlus.Application.CustomizeInfo.Server和ESPlus.Application.CustomizeInfo.Passive,分别用于服务端和客户端。

  你可能已经注意到,像 ESPlus.Application.xxxxxx.Server 和 ESPlus.Application.xxxxxx.Passive 通常是成对出现的,都是为了解决xxxxxx问题而对服务端和客户端的支持。而且,这种成对的关系也不会出现错误的匹配,比如,服务端调用ESPlus.Application.Basic.Server下的IBasicController的Broadcast方法进行广播(对所有人),一定是由ESPlus.Application.Basic.Passive下的IBasicBusinessHandler接口的HandleBroadcastFromServer方法来处理,而不会错乱匹配到由ESPlus.Application.CustomizeInfo.Passive空间下的ICustomizeInfoBusinessHandler接口的HandleBroadcastFromServer方法(用于处理组内广播)来处理。

2. Rapid引擎仅仅使用了ESPlus.Application下的两个命名空间

Rapid引擎主要使用了ESPlus.Application.Basic和ESPlus.Application.CustomizeInfo命名空间下的组件。如果要使用ESPlus.Application下的其它命名空间中的组件(如ESPlus.Application.FileTransfering命名空间用于文件传输),那么就不能使用Rapid引擎这个壳了,必须使用ESFramework 4.0 概述中列出的那些真正的网络引擎。 

3. Rapid引擎中简单的好友管理和组管理

IRapidServerEngine的Initialize方法有个稍微复杂的重载,即多接受IFriendsManager和IGroupManager两个参数,我稍微解释一下这两个参数的作用。

(1)IFriendsManager是给ESPlus.Application.Basic.Server下的组件用的,当某用户上下线时,需要通知该用户的好友(通过ESPlus.Application.Basic.Passive.IBasicBusinessHandler接口的相关方法),那么服务端从哪里知道该用户有哪些好友了,就是IFriendsManager接口:

    public interface IFriendsManager
    {
        List<string> GetFriendList(string ownerID);

    }

如果,调用RapidServerEngine的Initialize方法时,该参数传入null,则RapidServerEngine会自动使用DefaultFriendsManager,这个实现的假设是所有的在线用户都是好友 -- 所以,任何一个用户上下线,都会通知所有其他的在线用户。

(2)IGroupManager接口是给ESPlus.Application.CustomizeInfo.Server命名空间下的组件用的,当客户端或服务端需要在某个组内广播消息时,服务端需要根据groupID获取该组的成员,这就是通过IGroupManager接口来获取的:

    public interface IGroupManager
    {
        /// <summary>
        /// 获取某个组的所有成员列表。
        /// </summary>      
        List<string> GetMemberList(string groupID);
    }

如果在服务端Rapid引擎初始化时,该参数传入null,则RapidServerEngine会自动使用EmptyGroupManager,其GetMemberList方法将始终返回一个空的列表。如果需要用到组广播的功能,大家可以自己实现这个简单的接口,然后注入给服务端的Rapid引擎就行了。