ET服务端框架学习——消息相关组件

36 篇文章 2 订阅
22 篇文章 5 订阅

       这里要先说明一下ET框架中的消息类型,可以参考这篇文章《ET框架---消息类型浅析》: 

      1、客户端发送给服务器的消息 C2S
              1)不需要与其他服务器通信(普通消息) 
                       a、不需要返回结果(普通的普通消息) 
                       b、需要返回结果(普通的RPC消息) 
              2)需要与其他服务通信(Actor消息) 
                       a、不需要返回结果(普通的Actor消息) 
                       b、需要返回结果(Actor RPC消息) 
       2. 服务器发送给客户端的消息 S2C  
              1)返回客户端请求的消息(根据客户端的请求消息类型发送对应的回复类型) 
              2)主动发送的消息,比如帧同步消息。

       以上的属于服务端与客户端之间的消息类型,皆属于OuterMessage。(外部消息)  
       3. 服务器与其他服务器对话的消息(属于内部消息InnerMessage,且是Actor消息) 
              1)需要返回结果(Actor RPC消息) 
              2)不需要返回结果(普通的Actor消息

  • ActorMessageSenderComponent组件

       这个组件是用来发送普通actor消息的,actor消息其实就是服务器之前发送的消息。ET的框架体系中,每个客户端都是和gate服务器相连接的,当需要和其他服务器通讯的时候,都是通过gate服务器转发的。 Get方法,返回ActorMessageSender对象,这是一个结构体,内部存放的是地址Adress和ActorId,如下图:

如下图:

这里的ActorId其实就是客户端网络配置中的AppId做了一些处理获取的唯一id,和AppId是相关联的。而Address则是通过有StartConfigComponent组件,从配置中读取的对应InnerConfig的端口地址。

ActorMessageSender结构体还有两个发送消息的方法,定义在ActorMessageSenderHelper类中。Send方法,调用NetInnerComponent组件的Send方法,发送无返回的数据。Call方法,调用NetInnerComponent组件的Call方法,发送有返回的数据。

  • ActorLocationSenderComponent组件和ActorLocationSender信使组件

       这个组件用于发送local actor消息,所谓的local actor消息就是指的通过Local Server服务器发送的消息。该组件内部会缓存一个ActorLocationSender对象的字典和一些对该字典的操作。

       ActorLocationSender对象和ActorMessageSender这两个发送消息的对象(信使)的区别还是挺大的。当我们知道了消息接收方的唯一Id(Entity.Id????)后,就可以通过这个ActorLocationSender信使组件来发送消息,如果只是知道instanceId,则可以使用ActorMessageSender信使来发送消息。ActorMessageSender信使组件内部还维护了一个待发送消息的缓存队列Queue<ActorTask>ActorTask对象是一个结构体,如图:

结构体,如图:

IActorLocationRequest接口和IActorLocationResponse接口是和消息相关的一对接口,表示的是需要返回的消息。

        Dispose方法,会遍历ActorLocationSenders字典,执行每个值的Dispose方法。

        Get方法是对ActorLocationSenders字典的操作,从字典中获取指定id的Value值对象(ActorLocationSender对象),如果没有,则通过组件工厂创建一个ActorLocationSender组件对象。Remove方法也是对ActorLocationSenders字典的操作。

        ActorLocationSender信使组件接通了事件系统,Awake事件会初始化一些变量,LastRecvTime变量会赋值当前客户端时间。Start事件会开启一个协程,协程内部会通过LocationProxyComponent组件,根据该ActorLocationSender信使组件的Id计算出ActorId,同时调用组件的UpdateAsync()方法,方法中,获取到WaitingTasks队列的对头元素,通过调用ActorMessageSenderComponent组件的Call方法   ActorMessageSenderComponent组件的Call方法,根据返回消息的错误码类型,分别做出相应的操作。1、如果没找到Actor,重试。最多重试指定的次数。如果依旧失败,则清空发送队列,返回发送失败。2、如果所有的发送消息都得到了返回,发送任务完成,那么删除这个ActorLocationSender,及时回收发送对象。

 

      
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值