美文网首页
ET的消息派发流程

ET的消息派发流程

作者: m969 | 来源:发表于2020-08-29 15:28 被阅读0次

关键代码在OuterMessageDispatcher这个类里

    public class OuterMessageDispatcher: IMessageDispatcher
    {
        public void Dispatch(Session session, ushort opcode, object message)
        {
            DispatchAsync(session, opcode, message).Coroutine();
        }
        
        public async ETVoid DispatchAsync(Session session, ushort opcode, object message)
        {
            // 根据消息接口判断是不是Actor消息,不同的接口做不同的处理
            switch (message)
            {
                case IActorLocationRequest actorLocationRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
                {
                    long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
                    ActorLocationSender actorLocationSender = Game.Scene.GetComponent<ActorLocationSenderComponent>().Get(unitId);

                    int rpcId = actorLocationRequest.RpcId; // 这里要保存客户端的rpcId
                    long instanceId = session.InstanceId;
                    IResponse response = await actorLocationSender.Call(actorLocationRequest);
                    response.RpcId = rpcId;

                    // session可能已经断开了,所以这里需要判断
                    if (session.InstanceId == instanceId)
                    {
                        session.Reply(response);
                    }
                    
                    break;
                }
                case IActorLocationMessage actorLocationMessage:
                {
                    long unitId = session.GetComponent<SessionPlayerComponent>().Player.UnitId;
                    ActorLocationSender actorLocationSender = Game.Scene.GetComponent<ActorLocationSenderComponent>().Get(unitId);
                    actorLocationSender.Send(actorLocationMessage);
                    break;
                }
                case IActorRequest actorRequest:  // 分发IActorRequest消息,目前没有用到,需要的自己添加
                {
                    break;
                }
                case IActorMessage actorMessage:  // 分发IActorMessage消息,目前没有用到,需要的自己添加
                {
                    break;
                }
                default:
                {
                    // 非Actor消息
                    Game.Scene.GetComponent<MessageDispatcherComponent>().Handle(session, new MessageInfo(opcode, message));
                    break;
                }
            }
        }
    }

这个类处理的是服务端收到客户端的消息时对消息的处理流程,我们知道服务端和客户端是通过Session来通讯的,所以服务端首先是Gate Session会收到消息数据,然后来到这里,这里再根据消息类型走不同的处理流程。

如果是IActorLocationRequest类型消息,它会从SessionPlayerComponent拿到UnitId,通过UnitId取得ActorLocationSender,再用ActorLocationSender发送消息数据给Unit

相关文章

  • ET的消息派发流程

    关键代码在OuterMessageDispatcher这个类里 这个类处理的是服务端收到客户端的消息时对消息的处理...

  • ET消息流程

    不了解ET的,点击https://github.com/egametang/ET 一:消息分类 消息按照因果关系分...

  • 触摸,键盘事件处理流程

    1.整体流程 2.消息类型 3.按键消息派发过程 4.按键总体派发流程 ViewRoot中定义了一个ViewRoo...

  • ET消息传输流程

    ET消息传输流程 结构模型 NetworkComponent【NetOuterComponent、NetInner...

  • ET帧同步消息流程

    不了解ET的,点击 (https://github.com/egametang/ET) 在ET的Demo中,只有鼠...

  • 源码剖析 Objc 消息派发流程

    Objc 的方法调用是运行时决定的,系统会根据 selector 动态地查找 IMP,那么这一过程究竟是怎样实现的...

  • 浅谈Swift派发机制

    函数的派发机制分为:静态派发(直接派发)、函数表派发、消息派发 1、Swift中所有ValueType(值类型:S...

  • Swift - 函数的派发方式.

    编译型语言有三种基础的派发方式: 静态派发;函数表派发;消息机制派发(动态派发).我们都知道Objective-C...

  • RabbitMQ入门-消息订阅模式

    消息派发 上篇《RabbitMQ入门-消息派发那些事儿》发布之后,收了不少反馈,其中问的最多的还是有关消息确认以及...

  • Swift 函数派发机制

    编程语言 函数派发机制有三种: 【原文链接】 直接派发 函数表派发 消息机制派发 函数派发是程序判断使用哪种途径去...

网友评论

      本文标题:ET的消息派发流程

      本文链接:https://www.haomeiwen.com/subject/gvfjsktx.html