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); }
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); }
//连接网关 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; } }