Ejemplo n.º 1
0
        public void Dispatch(Session session, Packet packet)
        {
            ushort opcode = packet.Opcode();

            if (OpcodeHelper.IsClientHotfixMessage(opcode))
            {
                session.GetComponent <SessionCallbackComponent>().MessageCallback.Invoke(session, packet);
                return;
            }

            OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent <OpcodeTypeComponent>();
            Type   responseType = opcodeTypeComponent.GetType(opcode);
            object message      = session.Network.MessagePacker.DeserializeFrom(responseType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);
            // 如果是帧同步消息,交给ClientFrameComponent处理
            FrameMessage frameMessage = message as FrameMessage;

            if (frameMessage != null)
            {
                Game.Scene.GetComponent <ClientFrameComponent>().Add(session, frameMessage);
                return;
            }

            // 普通消息或者是Rpc请求消息
            MessageInfo messageInfo = new MessageInfo(opcode, message);

            Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, messageInfo);
        }
Ejemplo n.º 2
0
        public void Dispatch(Session session, Packet packet)
        {
            object message;

            try
            {
                if (OpcodeHelper.IsClientHotfixMessage(packet.Opcode))
                {
                    session.GetComponent <SessionCallbackComponent>().MessageCallback.Invoke(session, packet);
                    return;
                }

                OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent <OpcodeTypeComponent>();
                Type responseType = opcodeTypeComponent.GetType(packet.Opcode);
                message = session.Network.MessagePacker.DeserializeFrom(responseType, packet.Stream);
            }
            catch (Exception e)
            {
                // 出现任何解析消息异常都要断开Session,防止客户端伪造消息
                Log.Error(e);
                session.Error = ErrorCode.ERR_PacketParserError;
                session.Network.Remove(session.Id);
                return;
            }


            // 如果是帧同步消息,交给ClientFrameComponent处理
            FrameMessage frameMessage = message as FrameMessage;

            if (frameMessage != null)
            {
                Game.Scene.GetComponent <ClientFrameComponent>().Add(session, frameMessage);
                return;
            }

            // 普通消息或者是Rpc请求消息

            MessageInfo messageInfo = new MessageInfo(packet.Opcode, message);

            Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, messageInfo);
        }
Ejemplo n.º 3
0
        //连接网关
        public async ETTask <G2C_GateLogin> ConnectGate(string gateAddress, long key, int loginType)
        {
            try
            {
                // 创建一个ETModel层的Session,并且保存到ETModel.SessionComponent中
                ETModel.Session gateSession = ETModel.Game.Scene.GetComponent <NetOuterComponent>().Create(gateAddress); //连接网关
                ETModel.Game.Scene.GetComponent <ETModel.SessionComponent>().Session = gateSession;
                // 创建一个ETHotfix层的Session, 并且保存到ETHotfix.SessionComponent中
                Game.Scene.GetComponent <SessionComponent>().Session = ComponentFactory.Create <Session, ETModel.Session>(gateSession);
                gateSession.GetComponent <SessionCallbackComponent>().DisposeCallback += GateSessionDisposeCallback;
                G2C_GateLogin g2CLoginGate = (G2C_GateLogin)await SessionComponent.Instance.Session.Call(new C2G_GateLogin()
                {
                    Key = key
                });

                Log.Debug(SessionComponent.Instance.Session.Id.ToString());
                return(g2CLoginGate);
            }
            catch (Exception e)
            {
                Log.Error(e);
                throw;
            }
        }