public void Run(ETModel.Session s, Packet packet) { ushort opcode = packet.Opcode; byte flag = packet.Flag; OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); Type responseType = opcodeTypeComponent.GetType(opcode); object message = this.session.Network.MessagePacker.DeserializeFrom(responseType, packet.Stream); if ((flag & 0x01) > 0) { IResponse response = message as IResponse; if (response == null) { throw new Exception($"flag is response, but hotfix message is not! {opcode}"); } Action <IResponse> action; if (!this.requestCallback.TryGetValue(response.RpcId, out action)) { return; } this.requestCallback.Remove(response.RpcId); action(response); return; } Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message)); }
public void Run(ETModel.Session s, ushort opcode, MemoryStream memoryStream) { OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); object instance = opcodeTypeComponent.GetInstance(opcode); object message = this.session.Network.MessagePacker.DeserializeFrom(instance, memoryStream); if (OpcodeHelper.IsNeedDebugLogMessage(opcode)) { Log.Msg(message); } IResponse response = message as IResponse; if (response == null) { Game.Scene.GetComponent <MessageDispatcherComponent>().Handle(session, new MessageInfo(opcode, message)); return; } Action <IResponse> action; if (!this.requestCallback.TryGetValue(response.RpcId, out action)) { throw new Exception($"not found rpc, response message: {StringHelper.MessageToStr(response)}"); } this.requestCallback.Remove(response.RpcId); action(response); }
public async Task Handle(Session session, Entity entity, ActorRequest actorRequest) { ActorResponse actorResponse = new ActorResponse(); actorResponse.RpcId = actorRequest.RpcId; try { OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent <OpcodeTypeComponent>(); Type type = opcodeTypeComponent.GetType(actorRequest.Op); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage); // 发送给客户端 Session clientSession = entity as Session; clientSession.Send(actorResponse.Flag, message); session.Reply(actorResponse); await Task.CompletedTask; } catch (Exception e) { actorResponse.Error = ErrorCode.ERR_SessionActorError; actorResponse.Message = $"session actor error {e}"; session.Reply(actorResponse); throw; } }
public void Run(ETModel.Session s, byte flag, ushort opcode, MemoryStream memoryStream) { OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); object instance = opcodeTypeComponent.GetInstance(opcode); object message = this.session.Network.MessagePacker.DeserializeFrom(instance, memoryStream); if (OpcodeHelper.IsNeedDebugLogMessage(opcode)) { Log.Msg(message); } if ((flag & 0x01) > 0) { IResponse response = message as IResponse; if (response == null) { throw new Exception($"flag is response, but hotfix message is not! {opcode}"); } Action <IResponse> action; if (!this.requestCallback.TryGetValue(response.RpcId, out action)) { return; } this.requestCallback.Remove(response.RpcId); action(response); return; } Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message)); }
public void Run(Session s, Packet p) { ushort opcode = p.Opcode(); byte flag = p.Flag(); OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); Type responseType = opcodeTypeComponent.GetType(opcode); object message = ProtobufHelper.FromBytes(responseType, p.Bytes, Packet.Index, p.Length - Packet.Index); if ((flag & 0x01) > 0) { IResponse response = message as IResponse; if (response == null) { throw new Exception($"flag is response, but hotfix message is not! {opcode}"); } Action <IResponse> action; if (!this.requestCallback.TryGetValue(response.RpcId, out action)) { return; } this.requestCallback.Remove(response.RpcId); action(response); return; } Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message)); }
public async Task Handle(Session session, Entity entity, ActorRequest actorRequest) { OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent <OpcodeTypeComponent>(); Type type = opcodeTypeComponent.GetType(actorRequest.Op); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage); await Game.Scene.GetComponent <ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message); }
public static async Task <IResponse> Call(this Session session, IRequest request) { OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); byte[] bytes = ProtobufHelper.ToBytes(request); ushort opcode = opcodeTypeComponent.GetOpcode(request.GetType()); PacketInfo packetInfo = await session.Call(opcode, bytes); ushort responseOpcode = packetInfo.Opcode; Type t = opcodeTypeComponent.GetType(responseOpcode); object aa = ProtobufHelper.FromBytes(t, packetInfo.Bytes, packetInfo.Index, packetInfo.Length); IResponse response = (IResponse)aa; return(response); }
public async Task Handle(Session session, Entity entity, ActorRequest actorRequest) { OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent <OpcodeTypeComponent>(); Type type = opcodeTypeComponent.GetType(actorRequest.Op); IMessage message = (IMessage)session.Network.MessagePacker.DeserializeFrom(type, actorRequest.AMessage); if (message is OneFrameMessage aFrameMessage) { Game.Scene.GetComponent <ServerFrameComponent>().Add(aFrameMessage); ActorResponse actorResponse = new ActorResponse(); actorResponse.RpcId = actorRequest.RpcId; session.Reply(actorResponse); return; } await Game.Scene.GetComponent <ActorMessageDispatherComponent>().Handle(session, entity, actorRequest, message); }
public static void Awake(this OpcodeTypeComponent self) { self.Register(); //Type[] types = DllHelper.GetMonoTypes(); //foreach (Type type in types) //{ // object[] attrs = type.GetCustomAttributes(typeof(MessageAttribute), false); // if (attrs.Length == 0) // { // continue; // } // MessageAttribute messageAttribute = attrs[0] as MessageAttribute; // if (messageAttribute == null) // { // continue; // } // self.opcodeTypes.Add(messageAttribute.Opcode, type); //} }
public void Run(ETModel.Session s, ushort opcode, MemoryStream memoryStream) { OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); object instance = opcodeTypeComponent.GetInstance(opcode); object message = this.session.Network.MessagePacker.DeserializeFrom(instance, memoryStream); //屏蔽心跳日志输出 10009,和广播玩家下注日志 10044 && opcode!= 10044 if (OpcodeHelper.IsNeedDebugLogMessage(opcode) && opcode != 10009 && opcode != 10044) { Log.Msg(message, 1); } IResponse response = message as IResponse; //临时解决斗地主,没法收到消息的问题 if (response != null && response.Error == 200225) { Game.EventSystem.Run(EventIdType.DDZOutCardError, response.Message); } if (response == null) { Game.Scene.GetComponent <MessageDispatcherComponent>().Handle(session, new MessageInfo(opcode, message)); return; } Action <IResponse> action; if (!this.requestCallback.TryGetValue(response.RpcId, out action)) { throw new Exception($"not found rpc, response message: {StringHelper.MessageToStr(response)}"); } this.requestCallback.Remove(response.RpcId); action(response); }
public async void Dispatch(Session session, Packet packet) { object message; try { OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent <OpcodeTypeComponent>(); object instance = opcodeTypeComponent.GetInstance(packet.Opcode); message = session.Network.MessagePacker.DeserializeFrom(instance, packet.Stream); } catch (Exception e) { // 出现任何异常都要断开Session,防止客户端伪造消息 Log.Error(e); session.Error = ErrorCode.ERR_PacketParserError; session.Network.Remove(session.Id); return; } //Log.Debug($"recv: {JsonHelper.ToJson(message)}"); switch (message) { case IFrameMessage iFrameMessage: // 如果是帧消息,构造成OneFrameMessage发给对应的unit { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(unitId); // 这里设置了帧消息的id,防止客户端伪造 iFrameMessage.Id = unitId; OneFrameMessage oneFrameMessage = new OneFrameMessage { Op = packet.Opcode, AMessage = ByteString.CopyFrom(session.Network.MessagePacker.SerializeTo(iFrameMessage)) }; actorMessageSender.Send(oneFrameMessage); return; } case IActorRequest iActorRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端 { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(unitId); int rpcId = iActorRequest.RpcId; // 这里要保存客户端的rpcId IResponse response = await actorMessageSender.Call(iActorRequest); response.RpcId = rpcId; session.Reply(response); return; } case IActorMessage iActorMessage: // gate session收到actor消息直接转发给actor自己去处理 { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorMessageSender actorMessageSender = Game.Scene.GetComponent <ActorMessageSenderComponent>().Get(unitId); actorMessageSender.Send(iActorMessage); return; } } Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(packet.Opcode, message)); }