ESFramework介绍之(18)―― Tcp用户管理器组件

简介: 当我们的应用中客户端与AS之间是通过Tcp进行通信的时候,通常,应用也要求管理所有在线的用户。这种管理至少包含以下几点:(1) 当用户上线时,记录上线时间(2) 当用户请求服务时,记录请求服务的时间、服务的类型、本次服务下载的数据量(3) 当用户下线时,记录下线时间。

    当我们的应用中客户端与AS之间是通过Tcp进行通信的时候,通常,应用也要求管理所有在线的用户。这种管理至少包含以下几点:
(1) 当用户上线时,记录上线时间
(2) 当用户请求服务时,记录请求服务的时间、服务的类型、本次服务下载的数据量
(3) 当用户下线时,记录下线时间。并把本次用户登录、请求服务过程中的所有信息持久化保存(如记录到数据库)

    在ESFramework中,实现这种管理的是ITcpUserManager组件,通常,该组件由AS使用(因为在AS、FS、IRAS中只有AS是必须要求提供用户管理功能的)。除了上述功能外,ITcpUserManager组件还提供:
(1) 控制UI上用户实时状态的显示
(2) 对用户意外掉线进行定时检查
(3) 提供用户是否在线的查询
(4) 提供通过用户ID获取Tcp连接的查询

    为什么ITcpUserManager组件需要提供这些功能?为什么有些功能不在其他组件中提供、而非在ITcpUserManager组件之中不可?这些问题都需要你进行深入的思考,就像我们当初所做的那样。ITcpUserManager组件一开始并不是这样的设计,在经过几次重构改善后才是这个样子,现在这个设计已经稳定下来了。在思考的过程中,你需要记住一点:ITcpUserManager组件是用户状态最全面、最实时发布的地方。
    ITcpUserManager接口定义如下:

 1     public   interface  ITcpUserManager
 2      {            
 3           void  Start() ;
 4           void  Stop() ;
 5          
 6           void  DisposeOneUser( string  userID ,DisconnectedCause cause) ;
 7           void  DisposeOneConnection( int  connectID  ,DisconnectedCause cause) ;
 8           void  ServiceCommited( int  connectID , string  userID , int  serviceKey , int  dataCount) ;
 9           void  ActivateUser( string  userID) ;
10 
11           bool   IsUserOnLine( string  userID) ;
12           int    GetUserConnectID( string  userID) ; // 如果不在线,返回-1
13           string [] GetOnlineUserList() ; // IList中是在线的userID
14          
15           event  CbForTcpUserDisconn SomeOneDisconnected ;
16           event  CbSimpleStr         SomeOneConnected ; // UserID
17           event  CbSimple            Restarted ;
18 
19          ITcpUserDisplayer TcpUserDisplayer{ set  ;}  // 控制UI
20          IUserTaskReporter UserTaskReporter{ set  ;}  // 持久化服务记录清单
21           int  OnLineCheckSpan{ get  ; set  ;} // OnLineCheckSpan单位为分钟,如果不使用定时检查,则onLineCheckSpan为-1
22 
23      }

    那么,ITcpUserManager组件从哪里获取用户的这些实时信息了?
(1) 网络插件的ServiceCommited事件、网络插件的SomeOneDisConnected事件
(2) 定时检查器的掉线事件
(3) 基本请求处理者的RequestWithoutRespondArrived事件=》激活定时检查器中的某个用户
(4) Logout请求
    上述的几个信息来源决定了ITcpUserManager组件与其他几个组件的依赖关系。综合上面所有的,下面是ITcpUserManager组件与其他主要组件的依赖关系图:

    这些依赖关系的组装是由TcpUserManagerBridge类完成的,看看它的代码就知道怎么回事了:

TcpUserManagerBridge

    TcpUserManagerBridge相当与一种桥接模式(可从这里了解更多),使得组件与组件之间的耦合关系达到最小。

    在ESFramework内部,很多地方需要使用到ITcpUserManager组件,比如P2PMessageDealer组件中、ToLocalClientSender组件中等等,它们主要通过ITcpUserManager组件获取某用户的Tcp连接、或查看某用户是否在线。

    最后提一下ITcpUserManager用到的两个组件:IUserOnLineChecker和IUserTaskReporter。
    IUserOnLineChecker用于实现前面文章中谈到的“定时check消息”机制,当某个用户在指定的时间内没有任何消息发给服务器时,IUserOnLineChecker触发SomeConnectionTimeOuted事件通知该用户已经掉线。IUserOnLineChecker接口定义非常简单:

 1     public   interface  IUserOnLineChecker
 2      {        
 3           void  Start() ;
 4           void  Stop() ;
 5 
 6           void  RegisterOrActivateUser( string  userID) ;        
 7           void  UnregisterUser( string  userID) ;  // 被外界调用UnregisterUser时,不触发CheckSomeOneDisConnected事件
 8 
 9           int  CheckSpan{ get  ; set  ;}  // Minutes
10 
11           event  CbSimpleStr  SomeConnectionTimeOuted ;  // 仅是当定时检查出用户掉线时才触发
12      }    

    前面我们提到,当用户下线(掉线)时,需要把该用户本次登录的服务记录永久存储,这个功能是由IUserTaskReporter来完成的。

 1     public   interface  IUserTaskReporter
 2      {
 3           void  RecordTaskList(ITaskMainRecord mainRecord) ;
 4          ITaskMainRecord    CreateRudeTaskMainRecord() ;
 5          ITaskDetailRecord  CreateRudeTaskDetailRecord() ;
 6      }            
 7 
 8       public   interface  ITaskMainRecord
 9      {        
10           string      UserID{ get  ; set  ;}
11           int          TotalDataCount{ get  ; set  ;}
12          DateTime TimeLogon{ get  ; set  ;}
13          DateTime TimeLogout{ get  ; set  ;}        
14           int          RequestCount{ get  ; set  ;}
15 
16          ArrayList Details{ get  ; set  ;} // details中为ITaskDetailRecord
17      }
18 
19       public   interface  ITaskDetailRecord
20      {
21           int       ServiceKey{ get  ; set  ;}
22           int          DataCount{ get  ; set  ;}
23          DateTime RequestTime{ get  ; set  ;}        
24      }

    持久化的具体介质由你的应用决定。如果你使用数据库来存储,则可以将ITaskMainRecord和ITaskDetailRecord在数据库中设计成主从表关系。

    
上一篇文章:ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求

转到  :ESFramework 可复用的通信框架(序) 

 
   

 

目录
相关文章
|
网络协议 Windows
通用异步 Windows Socket TCP 客户端组件的设计与实现
编写 Windows Socket TCP 客户端其实并不困难,Windows 提供了6种 I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起,剪不断理还乱。
1104 0
|
缓存 网络协议 Windows
基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计与实现
设计概述   服务端通信组件的设计是一项非常严谨的工作,其中性能、伸缩性和稳定性是必须考虑的硬性质量指标,若要把组件设计为通用组件提供给多种已知或未知的上层应用使用,则设计的难度更会大大增加,通用性、可用性和灵活性必须考虑在内。
1442 0
|
网络协议 API
ESFramework介绍之(21)-- Tcp组件接口ITcp介绍
写了这么多篇介绍ESFramework的文章才想起来还有一些很基础的内容没有介绍,前面介绍的一些组件、框架基本上是与协议无关的(比如无论是Tcp还是Udp甚至是Remoting、WebService都可以通用),然而到了应用的最底层,我们总需要选择一种通信协议,.
884 0
|
9月前
|
机器学习/深度学习 人工智能 网络协议
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
TCP/IP五层(或四层)模型,IP和TCP到底在哪层?
170 4
|
监控 网络协议 网络架构
IP协议【图解TCP/IP(笔记九)】
IP协议【图解TCP/IP(笔记九)】
195 0
|
域名解析 网络协议
IP协议, TCP协议 和DNS 服务分别是干什么的?
大家好,我是阿萨。昨天讲解了网络四层协议[TCP/IP协议族分为哪4层?]今天我们学习下IP 协议, TCP 协议和DNS 协议分别是干什么的。
350 0
IP协议, TCP协议 和DNS 服务分别是干什么的?
|
网络协议
ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。
ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。
ACK的累加规则-wireshark抓包分析-不包含tcp头部、ip头部、数据链路层头部等。
|
网络协议 网络架构
六、TCP/IP模型 和 5层参考模型
六、TCP/IP模型 和 5层参考模型
六、TCP/IP模型 和 5层参考模型
|
网络协议
TCP/IP协议族有哪些?
大家好,我是阿萨。昨天我们学习了[URI 和URL 的区别是什么?]了解了URI 和URL的区别。 学习HTTP, 绕不开TCP/IP,那么TCP/IP 协议族分为哪4层?
350 0
TCP/IP协议族有哪些?
|
网络协议 网络性能优化 网络安全
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)
网络协议报文理解刨析篇二(再谈Http和Https), 加上TCP/UDP/IP协议分析(理解着学习), 面试官都惊讶你对网络的见解(2)

热门文章

最新文章