【转载】ESFramework介绍之(31)―― 消息分类及对应的处理器

本文介绍ESFramework中的IMessageTransceiver接口,该接口用于处理客户端间P2P消息的直接发送或通过服务器转发,并提供了相关的实现流程及组件说明。

ESFramework介绍之(35)―― IMessageTransceiver

    (本文适用于ESFramework V0.3+)
    
    在ESFramework介绍之(7)-- 服务器代理IServerAgent 一文中,我们详细的介绍了IServerAgent,我们已经知道,客户端与服务器之间的所有通信都可经过IServerAgent,包括要转发的P2P消息。IServerAgent的主要目的是:
(1)屏蔽客户端与服务端之间的通信协议(Tcp/Udp),ITcpServerAgent、IUdpServerAgent
(2)可将异步的消息请求/回复转化为同步的方法调用。 

    客户端与服务端的所有交互都可以通过IServerAgent进行,但是如果客户A与客户B之间直接进行P2P通信了?那么A和B之间的P2PMessage就不需要经过服务器转发,即不需要提交给IServerAgent,而是交给IP2PChannel发送;如果客户A和客户B之间不能直接通信,那么A和B之间的P2PMessage就需要经过服务器转发。

    为了对上层应用屏蔽P2PMessage是通过服务器转发器的还是通过IP2PChannel直接发送的,ESFramework引入了IMessageTransceiver,它的智能在于,如果P2PMessage可以通过IP2PChannel直接发送,则将其交给IP2PChannel,否则将其提交给IServerAgent由服务器转发。这样应用只需要直接使用IMessageTransceiver提交(发送)消息就可以了,而不用关心下层的消息路由途径。
    IMessageTransceiver接口定义如下:

    public   interface  IMessageTransceiver
    {
        
///   <summary>
        
///  如果超时仍然没有回复,则抛出超时异常
        
///  如果dataPriority != DataPriority.CanBeDiscarded ,则checkRespond只能为false
        
///   </summary>      
        NetMessage CommitRequest(NetMessage requestMsg ,DataPriority dataPriority ,  bool  checkRespond);        

        IP2PChannelManager P2PChannelManager{
set  ;}
        IServerAgent ServerAgent{
set  ;}
        IPassiveHelper PassiveHelper{
set  ;}
    }

    IMessageTransceiver及其相关组件关系图如下:
     
      
    我们看到,整个应用所有的消息收发都可以通过IMessageTransceiver进行,而不用在去操作IServerAgent了(当然,我们可以完全在IServerAgent的基础上构建应用,而不关心IMessageTransceiver的存在)。当有消息发送/提交(无论是基本消息、功能请求消息、还是P2P消息)时,直接提交给IMessageTransceiver即可。IMessageTransceiver对要发送的消息采取如下流程:
(1)如果是非P2P消息,则直接提交给IServerAgent。
(2)如果是P2P消息,然后向p2PChannelManager查询针对目标客户的P2PChannel是否存在,如果存在,则直接通过P2PChannel发送;否则,就提交给IServerAgent进行转发。
    以下是IMessageTransceiver实现这个流程的代码:

        public  NetMessage CommitRequest(NetMessage requestMsg, DataPriority dataPriority,  bool  checkRespond)
        {
            
// 通过IP2PChannel发送P2PMessage
             if ( this .passiveHelper.GetPassiveMessageType(requestMsg.Header.ServiceKey)  ==  PassiveMessageType.P2PMessage)
            {
                IP2PChannel channel 
=   this .p2PChannelManager.GetP2PChannel(requestMsg.Header.DestUserID) ;
                
if (channel  !=   null )
                {
                    channel.SendMessage(requestMsg) ;
                    
if (checkRespond)
                    {
                        
return   this .responseManager.PickupResponse(requestMsg.Header.ServiceKey ,requestMsg.Header.CorrelationID) ;
                    }

                    return null ;
                }
             }

            return this.serverAgent.CommitRequest(requestMsg ,dataPriority ,checkRespond) ;             
        }

    IP2PChannelManager组件用于管理当前客户与每个其它客户之间的P2P通道,它需要根据服务端发回的其它用户的地址、状态等信息来构建、销毁对应的P2P通道(IP2PChannel)。

    public   interface  IP2PChannelManager
    {
        IP2PChannel GetP2PChannel(
string  destUserID) ;
    }

    IP2PChannel,如其名,它是客户与客户之间P2P通信的信道的抽象,很显然,目前最常用的P2P通道是基于UDP的NAT穿透的通道,这是IP2PChannelManager的实现之一。如果可能(比如不同的客户位于同一局域网内部),我们也可以在客户之间使用基于Tcp 的P2P通道。IP2PChannel接口定义如下:

    public   interface  IP2PChannel
    {
        
void  SendMessage(NetMessage msg) ;
    }

   
    现在,使用ESFramework,我们可以在三个层次上构建你的客户端应用:
(1)直接在NetworkStream或Socket上构建,这样可以完全抛开ESFramework,但是这也需要你自己手动的处理所有麻烦的东西。
(2)在ITcpServerAgent上构建,这样ESFramework会帮你做好所有消息的收发,请求与回复的匹配,消息的优先级分类、消息的自动发送等等。
(3)在IMessageTransceiver构建,到这里,你甚至不用关心你的P2P消息是通过P2PChannel直接发送的还是通过服务器进行中转的。底层的通信方式对于你的应用是透明的。

    在后面介绍NAPT穿透时,我会给出基于NAPT的IP2PChannel实现和对应的IMessageTransceiver实现。感谢关注!

转载于:https://www.cnblogs.com/fx2008/archive/2011/11/27/2265247.html

消息部分:<br>1.ESFramework介绍之(1)――网络通信消息协议接口IContract<br><br>2.ESFramework介绍之(2)――网络通信消息NetMessage<br> <br>3.ESFramework介绍之(3)――消息处理器处理器工厂<br><br>4.ESFramework介绍之(4)――消息拦截器INetMessageHook <br><br>5.ESFramework介绍之(5)――消息分派器IMessageDispatcher<br><br>6.ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy <br><br>7.ESFramework介绍之(31―― 消息分类对应处理器 <br><br><br>通信基础设施(Tcp、Udp)<br>1.ESFramework介绍之(21)-- Tcp组件接口ITcp介绍 <br><br>2.ESFramework介绍之(23)―― AgileTcp <br><br>3.ESFramework介绍之(28)―― Udp组件<br><br><br>基于C/S的4层架构:<br>1.ESFramework介绍之(6)―― 基于C/S的4层架构概述 <br><br>2.ESFramework介绍之(10)-- Tcp连接池<br><br>3.ESFramework介绍之(11)-- Tcp连接池管理器<br><br>4.ESFramework介绍之(12)―― 基于Tcp连接池的消息处理器 <br><br>5.ESFramework介绍之(13)-- 功能插件处理器工厂<br><br>6.ESFramework介绍之(14)-- AS与FS通信方案 <br><br>7.ESFramework介绍之(15)-- IRAS<br><br>8.ESFramework介绍之(17)―― 支持漫游用户和跨区域功能请求 <br><br>9.ESFramework介绍之(18)―― Tcp用户管理器组件 <br><br>10.ESFramework介绍之(19)―― 对动态组ActiveGroup的支持 <br><br>11.ESFramework介绍之(24)―― 日志记录IEsbLogger <br><br>12.ESFramework介绍之(26)-- 支持复杂插件(InnerDealer 和 InnerDispatcher) <br><br>13.ESFramework介绍之(27)-- 支持OverdueMessage <br><br>14.ESFramework介绍之(29)―― 插件公共设施 AddinUtil <br><br>15.ESFramework介绍之(33)―― AS与FS通信实现及相关 <br>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值