zoukankan      html  css  js  c++  java
  • 重登陆模式 --ESFramework 4.0 快速上手(07)

      在ESFramework框架中基于TCP的服务端引擎(当然也包括Rapid引)都采用了这样一条规则:默认情况下,客户端与服务器成功建立TCP连接以后,服务端会从客户端发过来的第一条消息中取出消息头的UserID属性的值,并将其与对应的TCP连接绑定起来。这样,服务端就知道每一个TCP连接所对应的用户UserID,而当我们要求服务端向某个客户端发送消息时,服务端就知道通过哪个TCP连接进行发送了。TCP连接与UserID是一一对应的,一个TCP连接只能对应一个UserID,同样的,一个UserID最多存在一个TCP连接。

    一.两种重登陆模式

          在现实中,经常出现这样的情况:比如我们用的QQ,当我们用一个账号在A地登陆了,还未下线,而我又用此账号在B地登陆,会发生什么情况?QQ采用的是用新连接取代旧连接的策略,即通知A地的客户端其已经被挤掉线了(如提示“同名的用户已在其它地方登陆”),而对于后续的通信,服务器都将与B地的客户端进行。

      QQ采用的这种模式在ESFramework中称为ReplaceOld模式。但是,有的应用可能需要保留A地的连接而忽略新来的B地的连接,对于这种情况,我们可以采用另外一种模式:IgnoreNew。ESFramework通过RelogonMode枚举来定义这两种模式:

        /// <summary>
        
    /// 重登陆模式。当从另外一个新连接上收到一个同名ID用户的消息时,用户管理器对旧的连接的处理模式。
        
    /// </summary>
        public enum RelogonMode
        {
            
    /// <summary>
            
    /// 忽略新的连接。
            
    /// </summary>
            IgnoreNew = 0,

            
    /// <summary>
            
    /// 使用新的连接取代旧的连接。
            
    /// </summary>
            ReplaceOld
        }

      我们可以设置用户管理器IUserManager的RelogonMode属性来控制ESFramework采用哪种重登陆模式。

    二.ESFramework对两种重登陆模式的反应

    1.IgnoreNew模式     

        如果我们采用的是IgnoreNew模式, 当服务端从另外一个新的连接上收到同名用户发来的消息时,ESFramework会触发IUserManager的NewConnectionIgnored事件来通知服务端应用程序: 

       event CbGeneric<string ,IUserAddress> NewConnectionIgnored;

      事件的第一个参数string是同名用户的ID,第二个参数是新连接的客户端地址。

      服务端必须预定并处理该事件,如何处理了?通常,有两件事是必须要做的:

    (1)通知新连接对应的客户端,已经有同名的用户在线了,新的连接将被关闭。

    (2)关闭新的连接。

    2.ReplaceOld模式

          如果我们采用的是ReplaceOld模式, 当服务端从另外一个新的连接上收到同名用户发来的消息时,ESFramework会触发IUserManager的SomeOneBeingPushedOut事件来通知服务端应用程序: 

       event CbGeneric<UserData> SomeOneBeingPushedOut;

      即同名的老连接对应的客户端被挤掉了,事件的参数包含了旧连接对应的相关信息。

      相应的,服务端也必须预定并处理该事件,并且也是有两件事是必须要做的:

    (1)通知旧连接对应的客户端,有同名的用户连接上来,旧的连接将被关闭。

    (2)关闭旧的连接。

    三.ESPlus让重登陆模式的应用更easy

      ESPlus下的ESPlus.Application.Basic命名空间把上面所说的采用IgnoreNew模式或ReplaceOld模式时,服务端必须做的事情都处理了。比如,通知(新/旧)客户端,关闭(新/旧)TCP连接。

      ESPlus.Application.Basic.Server.BasicMessageProcesser类预定了IUserManager的NewConnectionIgnored和SomeOneBeingPushedOut事件,并在事件处理函数中通知了客户端,且关闭了需要关闭的连接。

      那么客户端应用程序如何知道服务端发来的相关通知了?

      当相关通知被客户端引擎接收到时,ESPlus会回调ESPlus.Application.Basic.Passive.IBasicBusinessHandler接口的OnBeingPushedOut方法或OnHaveLogonNotify方法:

            /// <summary>
            
    /// OnBeingPushedOut 被同名用户挤掉线。此时,客户端引擎已被Dispose。
            
    /// 发生于RelogonMode.ReplaceOld。
            
    /// </summary>
            void OnBeingPushedOut();

          
      /// <summary>
            
    /// OnHaveLogonNotify 当同名的用户已经登录,而且当前连接被忽略(已被服务端关闭)时调用此方法。此时,客户端引擎已被Dispose。
            
    /// 发生于RelogonMode.IgnoreNew。
            
    /// </summary>        
            void OnHaveLogonNotify();

      所以,客户端程序只要实现IBasicBusinessHandler接口的这两个方法,就能接收到自己被挤掉线或者同名用户已经登陆的通知了。

    四.Rapid引擎与重登陆模式

      支持ESFramework快速开发的Rapid引擎使用刚介绍的ESPlus.Application.Basic命名空间,其内部已经将与重登陆处理相关的组件都已经自动装配好了,所以,我们客户端只要实现上面说的IBasicBusinessHandler接口的两个方法来接收服务端的通知就OK了。

      Rapid引擎默认采用的是ReplaceOld模式,但是可以通过类似下面的语句将IUserManager的重登陆模式设置为IgnoreNew模式。

       ((IUserManager)rapidServerEngine.UserManager).RelogonMode = RelogonMode.ReplaceOld;

       

    ESFramework 4.0 概述

    《ESFramework 4.0 快速上手》系列所有文章

    《ESFramework 4.0 高级进阶》系列所有文章

     

  • 相关阅读:
    Java中的线程Thread方法之---interrupt() 分类: Android Java 2014-02-26 08:51 3189人阅读 评论(2) 收藏
    Java中的对象Object方法之---wait()和notifiy() 分类: Java Android 2014-02-26 08:50 1599人阅读 评论(0) 收藏
    Java中的线程Thread方法之---suspend()和resume() 分类: Java 2014-02-25 14:37 1650人阅读 评论(0) 收藏
    Java中的线程Thread方法之---join() 分类: Android Java 2014-02-25 13:38 1393人阅读 评论(0) 收藏
    Java中的线程Thread方法之---stop() 分类: Java 2014-02-25 09:59 3075人阅读 评论(1) 收藏
    抓包工具Fidder详解(主要来抓取Android中app的请求) 分类: Android 2014-02-24 09:32 10064人阅读 评论(5) 收藏
    XML的解析 分类: JavaWeb Java Android 2014-02-17 18:22 1764人阅读 评论(3) 收藏
    XML文件定义约束 分类: JavaWeb 2014-02-17 17:49 1127人阅读 评论(0) 收藏
    Android中的广播Broadcast详解 分类: Android 2014-02-13 10:59 8414人阅读 评论(5) 收藏
    GitHub错误处理:fatal:could not read Username for 'https://github.com': No such file or directory 分类: Java 2014-02-11 19:39 2346人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/1984489.html
Copyright © 2011-2022 走看看