ESFramework网络通信框架介绍之(2)――网络通信消息NetMessage

简介: ESFramework网络通信框架与元数据 较之C++而言,.NET是一个更加“动态”的平台,其动态能力建立在反射机制之上,而反射的基础是“元数据”。    上文已经提到过,如果一个框架要为我们的应用做更多的事情,那么这个框架必须建立更多的标准,必须对框架自己要处理的消息有更多的了解,所以,每个消息都要是自描述的,也就是说每个消息要包含它自己的“元数据”。

ESFramework网络通信框架与元数据

较之C++而言,.NET是一个更加“动态”的平台,其动态能力建立在反射机制之上,而反射的基础是“元数据”。

   
上文已经提到过,如果一个框架要为我们的应用做更多的事情,那么这个框架必须建立更多的标准,必须对框架自己要处理的消息有更多的了解,所以,每个消息都要是自描述的,也就是说每个消息要包含它自己的“元数据”。那么,“元数据”位于消息的何处了?你一定想到了,对,是消息头(MessagHeader)。

    在ESFramework网络通信框架中,消息NetMessage由“消息头+主体”构成,并且消息头和主体都必须实现上文讲到的IContract接口。消息头既是本条NetMessage的元数据,其中包含了诸如消息长度、消息类型等描述信息。ESFramework网络通信框架为了能识别每个消息的元数据,必须再建立一个“标准”,这个标准便是IMessageHeader接口。为了简化后面的计算和应用,ESFramework要求所有的消息头的长度是固定的,比如都是64字节。注意,固定消息头的长度不是必须的,但是这会降低框架的复杂度。
我们来看看IMessageHeader中包含了些什么信息:    

 1     public   interface  IMessageHeader : IContract ,ICloneable
 2      {
 3           int  MessageBodyLength    { get  ; set  ;}  // 本消息主体的长度
 4           int  TypeKey            { get  ; set  ;}  // 请求的服务目录类型
 5           int  ServiceKey        { get  ; set  ;}  // 请求类型
 6           int  ServiceItemIndex{ get  ; set  ;}  // 请求细分索引
 7           int  RandomNum        { get  ; set  ;}  // 用于将回复与请求一一对应起来                
 8           int  Result            { get  ; set  ;}  // 服务结果,1表示成功。其它值对应ServiceResultType            
 9           string  DestUserID   { get  ; set  ;}  // 接收消息的目标用户编号                
10           string  UserID        { get  ; set  ;}  // 发出请求的用户编号    
11           bool    P2PAck       { get  ; set  ;}  // 仅仅对P2P消息有效,1表示为服务器转发P2P消息的Ack,Result反映了转发成功还是失败。Ack消息主体为null
12           bool    ZipMe        { get  ; set  ;}  // 控制对于本条消息是否启用压缩/解压缩,如果有些消息比较短小,则将IMessageHeader.ZipMe设为false
13      }

    IMessageHeader现在已经包含了比较多的内容了,其实刚开始时,IMessageHeader仅仅需要32个字节就足够,随着ESFramework的演化成长,越来越多的信息慢慢加了进来,现在IMessageHeader的长度基本上需要96字节。加进来的内容对很多应用是必须的。

    比如,DestUserID表明了本条消息不是交给服务器处理的,而是要服务器转发给IDDestUserID的用户,这为框架引入了处理“P2P消息”的能力;有时,用户可能需要发送一系列按顺序的P2P消息,如果是基于UDP,则必须要等到对方确认收到上一个消息后,才可以发送下一个消息,于是就有了P2PAck字段。基于对网络上传输的消息进行压缩是常见的要求,而有些比较短小的消息又不必进行压缩的情况,就出现了ZipMe字段,表明消息是否被压缩/解压过。

    而在你的具体应用中,消息头应该包括哪些内容,由你的应用的需求来决定,比如,你的应用可能从来不需要处理P2P消息,那么在实现IMessageHeader接口时,就不需要关注DestUserID字段和P2PAck字段,并且在你的实际的消息头的字节流中也不需要为它们提供“位置”;而且在使用ESFramework网络通信框架装配你的应用的时候,也不用“接插”“P2PMessage处理器”。这是非常灵活的。

    刚才看到的是消息头的结构,那么消息主体是什么了?在框架这一层,由于框架对所有的具体消息的主体内容一无所知,即使框架知道消息主体可以被解析为一个IContract“对象”,但是在这一层,并没有足够的信息给框架去将主体解析为IContract。所以,框架中的消息主体仍然用字节流byte[]表示,而且框架也根本不关心这个消息主体如何解析、如何处理,这些都是应用的事情。框架已经通过消息的元数据对该消息有足够的了解了。
消息NetMessage的定义如下:

 1     [Serializable]
 2       public   class  NetMessage
 3      {
 4           public  IMessageHeader Header  =   null  ;
 5           public   byte []         Body    =   null  ;  // 可以经过压缩、变换Hook
 6           public   object          Tag     =   null  ;  // 用于在将NetMessage交给IDataDealer时传递额外的信息,不影响ToStream,且很少使用
 7 
 8           public  NetMessage()
 9          {
10          }
11 
12           #region  Ctor ,ToStream
13           public  NetMessage(IMessageHeader header , byte [] body)
14          {
15                //省略实现......             
23          }
24 
25           public   byte [] ToStream()
26          {    
27            //省略实现......            
41          }
42           #endregion
43 
44           #region  Length
45           public   int  Length
46          {
47             //省略实现......            
57          }
58           #endregion
59 
60      }

    Tag字段用于存放可能在后面的消息处理链中需要使用到的额外信息,比如,基于UDP时,Tag可以存放发送本条消息的客户的IPEndPoint,而这个信息可能会被后面的消息处理器用到。
    RoundedMessage包含了比NetMessage更丰富的信息,从网络进口接收到的实际上是RoundedMessage,有时消息分配器或处理器可能需要用到类似ConnectID这样的信息。

    在客户端和应用这一层,NetMessage可以向下转换,因为此时,我们已经知道了消息主体的结构,这个消息主体已经可以被解析为IContract了,所以NetMessage可以转换为Message:  

Message 
    public class Message 
    {
        
private IMessageHeader header ;
        
private IContract body   ;    

        
public Message(IMessageHeader theHeader ,IContract theBody)
        {
            
//省略实现......                 
        }    
    
        
public NetMessage ToNetMessage()
        {
            
//省略实现......            
        }
    
        
#region ToStream ,GetStreamLength
        
public int GetStreamLength()
        {
            
//省略实现......            
        }

        
public byte[] ToStream()
        {
            
//省略实现......            
        }

        
public void ToStream(byte[] buff, int offset)
        {
            
//省略实现......                 
        }
        
#endregion

        
#region Header ,Body ,MessageHelper
        
public IMessageHeader Header
        {
           //省略实现......            
        }

        
public IContract Body
        {
           //省略实现......            
        }    
        
#endregion    
        
    }

    可以看到,

NetMessage已经是一个完全的面向对象的消息了。而至于主体到底含有什么具体的内容,还需要对主体IContract向下转换到具体的协议上才行。这通常是消息处理器的工作。

关于消息处理器和处理器工厂的介绍,请留意下篇文章。 

ESFramework网络通信框架介绍之(3――消息处理器和处理器工厂 

从2004年7月开始,就一直从事N层C/S架构的服务端的开发,时至今日,慢慢的积累了一些开发经验,ESFramework网络通信框架体系便是这些经验的总结。ESFramework网络通信框架这是一套完全可复用的、灵活的、单纯的、支持N层C/S架构的网络通信框架


上一篇:ESFramework网络通信框架介绍之(1)――网络通信消息协议接口IContract

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

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

目录
相关文章
|
3月前
|
数据采集 存储 数据处理
Scrapy:Python网络爬虫框架的利器
在当今信息时代,网络数据已成为企业和个人获取信息的重要途径。而Python网络爬虫框架Scrapy则成为了网络爬虫工程师的必备工具。本文将介绍Scrapy的概念与实践,以及其在数据采集和处理过程中的应用。
23 1
|
3月前
|
NoSQL Linux Redis
Redis 的网络框架是实现了 Reactor 模型吗?
Redis 的网络框架是实现了 Reactor 模型吗?
|
6月前
|
缓存 网络协议 Dubbo
异步编程 - 12 异步、基于事件驱动的网络编程框架 Netty
异步编程 - 12 异步、基于事件驱动的网络编程框架 Netty
45 0
|
4月前
|
机器学习/深度学习 数据采集 分布式计算
社交网络分析4(下):社交网络链路预测分析、LightGBM框架、LLSLP方法(LightGBM 堆叠链路预测)、堆叠泛化 、社交网络链路预测分析的挑战
社交网络分析4(下):社交网络链路预测分析、LightGBM框架、LLSLP方法(LightGBM 堆叠链路预测)、堆叠泛化 、社交网络链路预测分析的挑战
218 0
|
13天前
|
网络协议 Java API
Python网络编程基础(Socket编程)Twisted框架简介
【4月更文挑战第12天】在网络编程的实践中,除了使用基本的Socket API之外,还有许多高级的网络编程库可以帮助我们更高效地构建复杂和健壮的网络应用。这些库通常提供了异步IO、事件驱动、协议实现等高级功能,使得开发者能够专注于业务逻辑的实现,而不用过多关注底层的网络细节。
|
存储 设计模式 网络协议
Netty网络框架(一)
Netty网络框架
31 1
|
1月前
|
网络协议 安全 网络安全
网络基础与通信原理:构建数字世界的框架
网络基础与通信原理:构建数字世界的框架
46 1
|
3月前
|
数据采集 存储 机器人
Scrapy网络爬虫框架——从入门到实践
网络爬虫已经成为了信息获取的必备工具之一,而Scrapy作为Python中最流行的网络爬虫框架之一,具有高效、可扩展、易用等特点。本文将深入介绍Scrapy框架的概念和实践,帮助读者快速掌握构建高质量网络爬虫的方法。
60 0
|
3月前
|
数据采集 存储 调度
Scrapy:从入门到实践的网络爬虫框架
Scrapy是一款强大的Python网络爬虫框架,可以帮助开发者更高效地抓取互联网上的数据。本文将介绍Scrapy的概念和基本原理,详细讲解如何使用Scrapy框架实现一个简单的网络爬虫,并分享一些实战经验和技巧。
|
3月前
|
数据采集 存储 调度
Scrapy:高效的Python网络爬虫框架
在信息时代,数据的获取和分析已经成为了一项重要的技能。而网络爬虫则是实现数据采集的一种常用手段。Scrapy作为一个高效、灵活的Python网络爬虫框架,其具备强大的扩展性、高度的可配置性以及良好的兼容性。本文将从Scrapy的概念入手,介绍其基本原理、使用方法以及实际应用案例。

热门文章

最新文章