ET的消息派发流程

本文主要探讨OuterMessageDispatcher类中服务端处理客户端消息的流程。当通过HTTP、WebSocket或Socket收到消息时,首先由Gate Session接收,然后利用SessionPlayerComponent获取UnitId,并通过UnitId定位到ActorLocationSender,最终将消息数据转发给对应的Unit。
摘要由CSDN通过智能技术生成

关键代码在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值