public void Dispatch(Session session, ushort opcode, int offset, byte[] messageBytes, AMessage message) { // 收到actor rpc request if (message is ActorRpcRequest actorRpcRequest) { Entity entity = Game.Scene.GetComponent <ActorManagerComponent>().Get(actorRpcRequest.Id); if (entity == null) { Log.Warning($"not found actor: {actorRpcRequest.Id}"); ActorRpcResponse response = new ActorRpcResponse { RpcId = actorRpcRequest.RpcId, Error = ErrorCode.ERR_NotFoundActor }; session.Reply(response); return; } entity.GetComponent <ActorComponent>().Add(new ActorMessageInfo() { Session = session, Message = actorRpcRequest }); return; } // 收到actor消息分发给actor自己去处理 if (message is ActorRequest actorRequest) { Entity entity = Game.Scene.GetComponent <ActorManagerComponent>().Get(actorRequest.Id); if (entity == null) { Log.Warning($"not found actor: {actorRequest.Id}"); ActorResponse response = new ActorResponse { RpcId = actorRequest.RpcId, Error = ErrorCode.ERR_NotFoundActor }; session.Reply(response); return; } entity.GetComponent <ActorComponent>().Add(new ActorMessageInfo() { Session = session, Message = actorRequest }); return; } if (message is AMessage || message is ARequest) { Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, message); return; } throw new Exception($"message type error: {message.GetType().FullName}"); }
public void Handle(Session session, MessageInfo messageInfo) { try { Request request = messageInfo.Message as Request; if (request == null) { Log.Error($"消息类型转换错误: {messageInfo.Message.GetType().Name} to {typeof(Request).Name}"); } this.Run(session, request, response => { // 等回调回来,session可以已经断开了,所以需要判断session id是否为0 if (session.Id == 0) { return; } session.Reply(messageInfo.RpcId, response); } ); } catch (Exception e) { throw new Exception($"解释消息失败: {messageInfo.Opcode}", e); } }
public async Task Handle(Session session, Entity entity, ActorRequest message) { Message msg = message.AMessage as Message; if (msg == null) { Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Message).Name}"); return; } E e = entity as E; if (e == null) { Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof(E).Name}"); return; } await this.Run(e, msg); // 等回调回来,session可以已经断开了,所以需要判断session id是否为0 if (session.Id == 0) { return; } ActorResponse response = new ActorResponse { RpcId = message.RpcId }; session.Reply(response); }
public async Task Handle(Session session, Entity entity, uint rpcId, ActorRequest message) { try { Request request = message.AMessage as Request; if (request == null) { Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof (Request).Name}"); return; } E e = entity as E; if (e == null) { Log.Error($"Actor类型转换错误: {entity.GetType().Name} to {typeof(E).Name}"); return; } await this.Run(e, request, response => { // 等回调回来,session可以已经断开了,所以需要判断session id是否为0 if (session.Id == 0) { return; } ActorResponse actorResponse = new ActorResponse { AMessage = response }; session.Reply(rpcId, actorResponse); }); } catch (Exception e) { throw new Exception($"解释消息失败: {message.GetType().FullName}", e); } }
public async void Dispatch(Session session, ushort opcode, int offset, byte[] messageBytes, AMessage message) { // gate session收到actor消息直接转发给actor自己去处理 if (message is AActorMessage) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); actorProxy.Send(message); return; } // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端 if (message is AActorRequest aActorRequest) { long unitId = session.GetComponent <SessionPlayerComponent>().Player.UnitId; ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId); uint rpcId = aActorRequest.RpcId; AResponse response = await actorProxy.Call <AResponse>(aActorRequest); response.RpcId = rpcId; session.Reply(response); return; } if (message != null) { Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, message); return; } throw new Exception($"message type error: {message.GetType().FullName}"); }
public void Handle(Session session, Entity entity, object message) { try { Request request = message as Request; if (request == null) { Log.Error($"消息类型转换错误: {message.GetType().FullName} to {typeof(Request).Name}"); } this.Run(session, request, response => { // 等回调回来,session可以已经断开了,所以需要判断session id是否为0 if (session.Id == 0) { return; } response.RpcId = request.RpcId; session.Reply(response); }); } catch (Exception e) { throw new Exception($"解释消息失败: {message.GetType().FullName}", e); } }
public async Task<bool> Handle(Session session, Entity entity, ActorRequest message) { ((Session)entity).Send(message.AMessage); ActorResponse response = new ActorResponse(); response.RpcId = message.RpcId; session.Reply(response); return true; }
public static void Reply(this Session session, uint rpcId, IResponse message) { OpcodeTypeComponent opcodeTypeComponent = Game.Scene.GetComponent <OpcodeTypeComponent>(); ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType()); byte[] bytes = session.Network.MessagePacker.SerializeToByteArray(message); session.Reply(opcode, rpcId, bytes); }
public async Task Handle(Session session, Entity entity, ActorRequest message) { ((Session)entity).Send(message.AMessage); ActorResponse response = new ActorResponse { RpcId = message.RpcId }; session.Reply(response); }
public void Handle(Session session, MessageInfo messageInfo) { try { Request request = MongoHelper.FromBson <Request>(messageInfo.MessageBytes, messageInfo.Offset, messageInfo.Count); this.Run(session, request, response => { // 等回调回来,session可以已经断开了,所以需要判断session id是否为0 if (session.Id == 0) { return; } session.Reply(messageInfo.RpcId, response); } ); } catch (Exception e) { throw new Exception($"解释消息失败: {messageInfo.Opcode}", e); } }