ESFramework对基于Tcp客户端的支持主要在ESFramework.Network.Tcp.Passive命名空间,下图给出了该命名空间中的核心组件,以及这些组件之间的关系:
下面解释一下这些组件的作用、职责。我们从最底层的通信组件NetworkStream向上看:
(1)NetworkStream 即是System.Net.Sockets.NetworkStream类,在ESFramework中,它是最底层的通信组件。
(2)ITcpAutoSender组件,它主要实现了数据的自动发送和数据优先级。关于ITcpAutoSender的更多信息,可以参见ESFramework介绍之(16)―― Tcp数据自动发送器ITcpAutoSender 。
(3)ITcpPassive组件,这个组件类似于服务端的ITcp组件,所有应用的网络数据的进出都必须经过它。ITcpPassive 封装了数据接收线程,完全向客户端隐藏了网络通信细节。ITcpPassive构建在ITcpAutoSender之上,所有的数据发送都委托给ITcpAutoSender。而数据的接收仍然是直接使用NetworkStream 。
(4)ITcpServerAgent组件,它使得使用基于消息请求/回复的与服务器的交互就像本地方法调用一样。关于它的详细介绍,请参见ESFramework介绍之(7)-- 服务器代理IServerAgent 。
(5)HookList,即INetMessageHook链,这个我们在介绍服务端时已经见过很多了。ESFramework对于客户端提供了Hook的支持,但是没有提供对Spy的支持,这是因为绝大多数情况下,我们的客户端并不需要Spy消息。(关于Hook与Spy的区别,可以参见ESFramework介绍之(30)―― 消息侦察者 INetMessageSpy )
(6)IDataDealerFactory组件,处理器工厂,可以直接使用ESFramework.Network.Passive.EsbPassiveDealerFactory组件。
(7)EsbPassiveDataDealer组件,如果你的应用在ITcpServerAgent组件的层次上创建,那么就可以直接使用 EsbPassiveDataDealer来处理所有的来自服务端的数据。EsbPassiveDataDealer将所有来自服务器的数据分为如下几类:
public enum PassiveMessageType
{
Response ,
Ack ,
P2PMessage ,
Notify //服务器给的通知
}
其中,P2PMessage和Notify都是SingleMessage。服务器发过来的一个消息,如果没有请求与之对应,则称之为单身消息SingleMessage。EsbPassiveDataDealer将所有的SingleMessage交给ISingleMessageDealer组件处理,而将所有的回复消息或ACK消息放到IResponseManager(基于此,才可实现ITcpServerAgent的主要目的)。{
Response ,
Ack ,
P2PMessage ,
Notify //服务器给的通知
}
(8)ISingleMessageDealer组件,用于处理所有的SingleMessage,如P2PMessage和Notify。
通常,你的应用可以在两个层次上创建,ITcpPassive层次和ITcpServerAgent层次。
我推荐在ITcpServerAgent层次上创建应用,这样你可以省去很多麻烦,充分发挥ESFramework框架的能力。而且,你会得到这些好处:
(1)回复消息与请求消息的自动匹配。如果应用构建于ITcpPassive层次,则你必须在应用中自己来将回复与请求一一对应起来。
(2)像调用本地方法一样与服务器进行交互。所有与服务器的交互都通过ITcpServerAgent.CommitRequest方法进行,如果需要回复消息,则回复消息直接通过ITcpServerAgent.CommitRequest方法的返回值获得。
(3)使得客户端业务功能可以以插件形式实现。这主要也是得力于ITcpServerAgent,它使得网络变得透明,并且将异步的消息请求/回复转变成同步。在插件内部,可以直接使用ITcpServerAgent与服务端交互来同步获取服务结果。关于客户插件IPassiveAddin的更多信息,可以参见ESFramework介绍之(8)-- 客户端插件IPassiveAddin
(4)你仅仅需要实现ISingleMessageDealer接口来处理服务端发过来的P2PMessage和Notify,而不必创建额外的处理器来处理Response和Ack消息。
转到 :ESFramework 可复用的通信框架(序)