• ESFramework介绍之(32)―― Tcp客户端核心组件关系图


        如果你的客户端基于ESFramework构建,并使用Tcp与服务端通信。通过这篇文章你将知道如何迅速、高效地创建客户端应用。

        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的主要目的)。


    (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 可复用的通信框架(序) 




  • 相关阅读:
    Merge k Sorted Lists
    N-Queens
    N-Queens II
    Reorder List
    使用AJAX实现文件上传时Illegal invocation错误
    php页面开启错误提示
    php分割最后一个逗号后面的字符
    微信卡券添加(微擎系统)
    php请求php
    Navicat MySQL连接Linux下MySQL的问题解决方案
  • 原文地址:https://www.cnblogs.com/zhuweisky/p/407367.html
Copyright © 2020-2023  润新知