`
soboer
  • 浏览: 1314076 次
文章分类
社区版块
存档分类
最新评论

ESFramework 开发手册(02) -- 基础功能与状态通知

 
阅读更多

本文介绍ESFramework 开发手册(00) -- 概述一文中提到的四大武器的第二个:基础功能与状态改变通知。

在解决了发送信息和处理信息之后,还有一些基础功能是很多分布式通信系统都需要用到的,比如,查询某个用户是否在线、获取在线的好友列表、当好友上下线时得到通知,等等。ESPlus.Application.Basic命名空间下的组件,为我们解决了这些基础问题。

1.客户端

客户端通过调用ESPlus.Application.Basic.Passive.IBasicOutter接口对应的方法以及预定其相关的事件,就可以完成基础功能或得到相关状态改变通知。

我们可以从ESPlus.Rapid.IRapidPassiveEngine暴露的BasicOutter属性来获取IBasicOutter引用。

状态改变事件通知

首先,我们看看IBasicOutter暴露的几个事件,这几个事件都是当自己或好友的状态发生改变时触发的。

  • FriendConnected、FriendOffline 、GroupmateConnected、GroupmateOffline 四个事件用于在好友与组友上下线时,通知当前的客户端用户的。所谓组友Groupmate,就是同属一个组(比如)的成员。至于服务端是如何知道一个用户有哪些好友和有哪些组友了,请参见好友与组
  • BeingPushedOut、TimeoutOffline、BeingKickedOut、HadLogon 四个事件用于在自己的状态变化时得到通知的。BeingPushedOut和HadLogon事件是否能触发、以及在什么条件下触发,取决于服务端设置的重登陆模式的策略。关于重登陆模式的更多内容可以参见重登陆模式

基础API

接下来,我们看看IBasicOutter的几个方法。

  • Logon方法用于在登录时验证用户密码。该方法会在客户端Rapid引擎初始化时被引擎自动调用,所以,在使用Rapid引擎时,我们通常不需要手动调用它。如果有的系统需要验证除了密码之外更多的信息,那么可以通过systemToken参数进行传递这些额外信息。Logon方法返回类型为LogonResponse,其属性LogonResult是一个枚举,表示了登录结果。如果LogonResult为Succeed,表示登录成功;如果LogonResult为HadLoggedOn,表示该账号已经在其它地方登录;如果LogonResult为Failed,则表示验证账号密码没有通过,没有通过的原因由LogonResponse的FailureCause属性指明。
  • GetAllOnlineFriends、GetAllOnlineGroupmates用于获取所有在线的好友和组友,如果我们的系统需要支持好友或组友,那么,通常我们会在客户端Rapid引擎初始化成功后,调用这两个方法以初始化在线好友列表和在线组友列表,并且结合预定前面的FriendConnected、FriendOffline 、GroupmateConnected、GroupmateOffline 这四个事件,那么,在客户端实例运行的整个生命期内,就可以实时地知道每个好友和组友的在线状态了。
  • Ping方法,用于获取当前客户端到服务端或到另一个在线客户端的消息来回的耗时,由于其是在应用层来模拟类似ICMP的ping,所以这个方法返回的值通常比ICMP的ping大一些。尽管如此,在一些应用中,该Ping的结果还是有一些参考价值的。
  • 有时,我们需要命令服务器将一些恶意的用户从服务端踢出(断开其连接),那么就可以调用KickOut方法,被踢出的客户端将会触发上述的BeingKickedOut事件。
  • SendHeartBeatMessage方法用于向服务器发送心跳消息。如果我们使用的是Rapid引擎,那么框架会自动发送心跳消息,所以,我们通常不需要手动调用该方法。关于心跳消息的更多内容可以参见心跳机制

TCP连接状态

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事件来作为重连成功/失败的依据。

2.服务端

基础控制

  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属性用于设置重登录模式,关于重登陆模式的更多内容可以参见重登陆模式

3.UserID的长度

  在ESFramework 4.0 进阶(01)-- 消息一文中我们介绍了ESPlus提供了默认的消息头实现,而Rapid引擎使用的就是ESPlus提供的基于二进制的消息头StreamMessageHeader,这个消息头的默认长度是36字节,允许的UserID最大长度为11字节。但是,如果你的系统中需要用到的UserID长度超过了11字节,该怎么办了?我们可以通过调用StreamMessageHeader的SetMaxLengthOfUserID静态方法来设定ESFramework允许的UserID的最大长度:

  注意,我们必须在Rapid引擎的Initialize方法执行之前调用SetMaxLengthOfUserID方法。而且,客户端和服务端必须采用相同的设置,否则,就一定会导致服务端和客户端通信出现异常。如果你的客户端是使用的Silverlight,那么使用ESFramework.SL时也是如此。
  • 服务端和桌面客户端请调用ESPlus.Core.StreamMessageHeader的SetMaxLengthOfUserID方法进行设置。
  • Silverlight的客户端请调用ESFramework.SL.StreamMessageHeader的SetMaxLengthOfUserID方法进行设置。

在ESFramework内部,组ID(即上面提到的groupID)也采用与UserID相同的规则。
  还要提醒的是,在能满足项目需求的情况下,尽可能使UserID的最大长度短一点,这样可以使得消息头更加短小,从而避免浪费本不需要的带宽。尤其在高性能、巨大并发的应用中,这点就更关键了。

4.消息的最大长度

  Rapid引擎内部默认设置的消息的最大长度为1M(1024*1024),并且这个长度还包含了上述消息头的长度。如果您的应用需要发的单个信息的长度超过了1M,就会被ESFramework认为是恶意的消息,ESFramework会丢弃该消息并关闭对应的连接。

我们建议:在能同样满足项目的需求下,应该尽可能地使传送的消息小,这样不仅可以节省带宽,而且还有助于提升并发的性能。如果应用中确实需要信息的长度超过1M,那么可以通过Rapid引擎暴露的内部核心引擎接口来设置所允许的最大消息长度。

  • 服务端:RapidServerEngine暴露的TcpServerEngine内核引擎,可以设置其MaxMessageSize属性的值。
  • 客户端:RapidPassiveEngine暴露的TcpPassiveEngine内核引擎,也可以设置其MaxMessageSize属性的值。

最后,大家可以查看最简单的那个demo的源码,并运行demo,来了解上述的状态改变通知及其它基础功能。谢谢。

阅读 更多ESFramework开发手册系列文章

-----------------------------------------------------------------------------------------------------------------------------------------------

下载免费版本的ESFramework 以及 demo源码

关于ESFramework的任何问题,欢迎联系我们:

电话:15807162718
Q Q:372841921

分享到:
评论

相关推荐

    ESFramework

    ESFramework ESFramework ESFramework

    PHP实例开发源码-ESFramework之P2P通信Demo php版.zip

    PHP实例开发源码—ESFramework之P2P通信Demo php版.zip PHP实例开发源码—ESFramework之P2P通信Demo php版.zip PHP实例开发源码—ESFramework之P2P通信Demo php版.zip

    ESFramework系列Demo源码

    本demo是一个简单的IM程序,展示了Rapid引擎最基础的功能:信息类型定义、协议定义、信息发送与处理、信息同步调用、好友上下线通知、断线重连等。 2.ESFramework之文件传送Demo 本demo是在1.ESFramework之入门Demo...

    ESFramework .net框架

    ESFramework不仅仅提供了一个基础的C/S框架和大量C/S应用中常用的组件,而且在ESFramework框架之上,引入的一个扩展层--ESFramework扩展层,专门用于解决的与具体应用相关的领域问题。ESFramework体系包括...

    PHP实例开发源码-ESFramework之文件传送Demo.zip

    PHP实例开发源码—ESFramework之文件传送Demo.zip PHP实例开发源码—ESFramework之文件传送Demo.zip PHP实例开发源码—ESFramework之文件传送Demo.zip

    ESFramework网络链接库

    ESFramework 虽然功能强大丰富,但是使用非常简单,因为其采用了优秀的架构设计和实现,将复杂性都屏蔽在了框架的内部,暴露给使用者的都是简单易用、清晰明确的API。而且,ESFramework还提供了Rapid引擎给使用者...

    ESFramework之入门Demo.rar

    本demo是一个简单的IM程序,展示了Rapid引擎最基础的功能:信息类型定义、协议定义、信息发送与处理、信息同步调用、好友上下线通知、断线重连等

    PHP实例开发源码-ESFramework之动态组Demo php版.zip

    PHP实例开发源码—ESFramework之动态组Demo php版.zip PHP实例开发源码—ESFramework之动态组Demo php版.zip PHP实例开发源码—ESFramework之动态组Demo php版.zip

    ESFramwork2.0

    - Tcp连接池管理器 <br>4.ESFramework介绍之(12)―― 基于Tcp连接池的消息处理器 <br>5.ESFramework介绍之(13)-- 功能插件处理器工厂 <br>6.ESFramework介绍之(14)-- AS与FS通信方案 <br>7...

    ESFramework网络通信框架

    这是一套完全可复用的、灵活...ESFramework不仅仅提供了一个基础的C/S框架和大量C/S应用中常用的组件,而且在ESFramework框架之上,引入的一个扩展层--ESFramework扩展层,专门用于解决的与具体应用相关的领域问题。

    ESFramework2.0

    ESFramework2.2最新版本

    ESFramework之P2P通信Demo.rar

    本demo是在ESFramework.Demos.FileTransfer的基础之上,增加了P2P通信的功能。客户端之间如果P2P通道创建成功,则它们之间的消息将直接使用P2P通道传送。

    ESFramework之文件传送Demov1.0

    本demo是在ESFramework.Demos.Simplest的基础之上,增加了客户端之间传送文件(夹)的功能,并可以演示文件传送中断通知、断点续传等特性。

    ESFramework2.0源码和Demo

    ESFramework2.0源码、 ESFramework Demos、 ESFramework4.7通信框架

    ESFramework实例

    ESFramework实例

    ESFramework2.0源码

    ESFramework2.0源码、 ESFramework Demos、 ESFramework4.7通信框架 即时通信框架

    ESFramework.Demo

    ESFramework.Demo

    ESFramework通信组件 v4.0.zip

    ESFramework通信组件,底层使用IOCP模型,支持局域网和广域网的P2P通信,支持文件传送,支持跨平台通信,支持服务器群集,可以嵌入其它软件,二次开发,文档齐全,接口清晰规范,容易上手。

Global site tag (gtag.js) - Google Analytics