本文介绍ESFramework 开发手册(00) -- 概述一文中提到的四大武器的第二个:基础功能与状态改变通知。
在解决了发送信息和处理信息之后,还有一些基础功能是很多分布式通信系统都需要用到的,比如,查询某个用户是否在线、获取在线的好友列表、当好友上下线时得到通知,等等。ESPlus.Application.Basic命名空间下的组件,为我们解决了这些基础问题。
客户端通过调用ESPlus.Application.Basic.Passive.IBasicOutter接口对应的方法以及预定其相关的事件,就可以完成基础功能或得到相关状态改变通知。
我们可以从ESPlus.Rapid.IRapidPassiveEngine暴露的BasicOutter属性来获取IBasicOutter引用。
首先,我们看看IBasicOutter暴露的几个事件,这几个事件都是当自己或好友的状态发生改变时触发的。
接下来,我们看看IBasicOutter的几个方法。
Basic空间提供了一部分基础功能,还有另一部分很重要的基础功能需要涉及到客户端的TCP引擎(因为客户端Rapid引擎内部使用的正是基于二进制的TCP引擎),我们在这里也一并介绍一下。客户端如何知道自己与服务器的TCP连接的状态变化了?ESFramework.Engine.Tcp.Passive.ITcpPassiveEngine 的几个事件和属性来获取这些信息。
我们可以从ESPlus.Rapid.IRapidPassiveEngine暴露的TcpPassiveEngine属性来获取ITcpPassiveEngine引用。
注释已经很好的说明了每个事件和属性的用途,这里就不赘述了。
值得一提的是,ConnectionRebuildSucceed事件,当网络恢复,TCP重连成功时,将会触发此事件。但对使用Rapid引擎的开发人员来说,这并不是全部。Rapid客户端引擎(ESPlus.Rapid.IRapidPassiveEngine),会在ConnectionRebuildSucceed事件触发时,自动登录服务器重新验证用户账号和密码,并触发RelogonCompleted事件。RelogonCompleted事件的参数为LogonResult,表明了重新登录验证的结果。而且,如果验证失败,与服务器的连接将会再次断开,且后续不会再自动重连。所以,当开发人员在进行二次开发时,要依据IRapidPassiveEngine的RelogonCompleted事件来作为重连成功/失败的依据。
Basic的服务端就相当简单了。首先,我们可以通过ESPlus.Application.Basic.Server.IBasicController的KickOut方法来在服务端进行踢人操作。
我们可以从ESPlus.Rapid.IRapidServerEngine暴露的BasicController属性来获取IBasicController引用。
刚刚我们提到客户端可以调用IBasicOutter的Logon方法进行登陆验证,那么这个验证服务端是在哪里做的了?服务端正是通过ESPlus.Application.Basic.Server.IBasicHandler的VerifyUser方法来验证用户账号密码的。
请注意,如果账号密码验证不通过,可以通过failureCause参数返回不通过的原因。failureCause的值将被传递并赋值给Logon方法返回的LogonResponse的FailureCause属性。
同上一章讲到的ICustomizeHandler一样,我们要在系统中根据项目的具体需求来实现IBasicHandler接口并将其注入到框架中。
服务端如何知道用户上下线、以及每个在线用户的状态了?
只要通过ESFramework.Server.UserManagement.IUserManager的相关事件和方法就能得到这些信息。我们可以从ESPlus.Rapid.IRapidServerEngine暴露的UserManager属性来获取IUserManager引用。IUserManager接口定义如下:
RelogonMode属性用于设置重登录模式,关于重登陆模式的更多内容可以参见重登陆模式。
在ESFramework 4.0 进阶(01)-- 消息一文中我们介绍了ESPlus提供了默认的消息头实现,而Rapid引擎使用的就是ESPlus提供的基于二进制的消息头StreamMessageHeader,这个消息头的默认长度是36字节,允许的UserID最大长度为11字节。但是,如果你的系统中需要用到的UserID长度超过了11字节,该怎么办了?我们可以通过调用StreamMessageHeader的SetMaxLengthOfUserID静态方法来设定ESFramework允许的UserID的最大长度:
在ESFramework内部,组ID(即上面提到的groupID)也采用与UserID相同的规则。
还要提醒的是,在能满足项目需求的情况下,尽可能使UserID的最大长度短一点,这样可以使得消息头更加短小,从而避免浪费本不需要的带宽。尤其在高性能、巨大并发的应用中,这点就更关键了。
Rapid引擎内部默认设置的消息的最大长度为1M(1024*1024),并且这个长度还包含了上述消息头的长度。如果您的应用需要发的单个信息的长度超过了1M,就会被ESFramework认为是恶意的消息,ESFramework会丢弃该消息并关闭对应的连接。
我们建议:在能同样满足项目的需求下,应该尽可能地使传送的消息小,这样不仅可以节省带宽,而且还有助于提升并发的性能。如果应用中确实需要信息的长度超过1M,那么可以通过Rapid引擎暴露的内部核心引擎接口来设置所允许的最大消息长度。
最后,大家可以查看最简单的那个demo的源码,并运行demo,来了解上述的状态改变通知及其它基础功能。谢谢。
关于ESFramework的任何问题,欢迎联系我们: