コード例 #1
0
        public async void Dispatch(Session session, Opcode opcode, int offset, byte[] messageBytes, AMessage message)
        {
            // gate session收到actor消息直接转发给actor自己去处理
            if (message is AActorMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.mBaseInfo.roleId;
                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.mBaseInfo.roleId;
                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}");
        }
コード例 #2
0
ファイル: MessageBroker.cs プロジェクト: chembergj/VSPC
 public void Publish(AMessage msg)
 {
     List<IVSPCMessageHandler> filteredHandlers;
     if (messageHandlers.TryGetValue(msg.GetType(), out filteredHandlers))
     {
         filteredHandlers.ForEach(h => h.HandleMessage(msg, context));
     }
 }
コード例 #3
0
        public void Publish(AMessage msg)
        {
            List <IVSPCMessageHandler> filteredHandlers;

            if (messageHandlers.TryGetValue(msg.GetType(), out filteredHandlers))
            {
                filteredHandlers.ForEach(h => h.HandleMessage(msg, context));
            }
        }
コード例 #4
0
        public void Handle(AMessage msg)
        {
            Message message = msg as Message;

            if (message == null)
            {
                Log.Error($"消息类型转换错误: {msg.GetType().Name} to {typeof(Message).Name}");
            }
            this.Run(message);
        }
コード例 #5
0
ファイル: InnerMessageDispatcher.cs プロジェクト: lzchina/ET
        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}");
        }
コード例 #6
0
ファイル: VSPCMessageHandler.cs プロジェクト: chembergj/VSPC
 public override void HandleMessage(AMessage message, VSPCContext context)
 {
     if (message is UserClickedLoginMessage)
         Connect((UserClickedLoginMessage)message, context);
     else if (message is UserClickedLogoffMessage)
         Disconnect((UserClickedLogoffMessage)message, context);
     else if (message is PositionReportMessage)
         SendPositionReportToFSDServer((PositionReportMessage)message, context);
     else if (message is ErrorMessage)
         Logger.Error("FSD Error received: {0} {1} {2}", ((ErrorMessage)message).ErrorCode, ((ErrorMessage)message).ErrorInfo, ((ErrorMessage)message).ErrorText);
     else if (message is VSPC.Core.Messages.FLSIM.FlightsimConnectedMessage)
         context.FlightsimIsConnected = true;
     else if (message is VSPC.Core.Messages.FLSIM.FlightsimDisconnectedMessage)
         context.FlightsimIsConnected = false;
     else if (message is TextMessageSend)
         SendTextMessage((TextMessageSend)message);
     else
         Logger.Error("Unexpected message type received in FSDMessageHandler: " + message.GetType().Name);
 }
コード例 #7
0
ファイル: MessageProcessor.cs プロジェクト: ha11owed/RPC
        public AMessage GetResponse(AMessage message)
        {
            if (message == null)
            {
                return(null);
            }

            AMessage result = null;

            switch (message.Id)
            {
            // ---- Call ----
            case MessageId.CallRequest:
                CallRequest callRequest = (CallRequest)message;
                result = callHandler.HandleCallRequest(callRequest);
                if (result == null)
                {
                    lock (sync)
                    {
                        // Add the call request to the queue
                        pendingRequests.Add(callRequest);
                    }
                    // Send a method info request
                    MethodInfoRequest methodInfoRequest = new MethodInfoRequest();
                    methodInfoRequest.MethodInfoId = callRequest.MethodInfoId;
                    result = methodInfoRequest;
                }
                break;

            case MessageId.CallAnswer:
                callHandler.HandleCallAnswer((CallAnswer)message);
                break;

            // ---- MethodInfo ----
            case MessageId.MethodInfoRequest:
                result = callHandler.HandleMethodInfoRequest((MethodInfoRequest)message);
                break;

            case MessageId.MethodInfoAnswer:
                MethodInfoAnswer methodInfoAnswer = (MethodInfoAnswer)message;
                callHandler.HandleMethodInfoAnswer(methodInfoAnswer);

                CallRequest pendingCallRequest = null;
                lock (sync)
                {
                    for (int i = 0; i < pendingRequests.Count; i++)
                    {
                        if (pendingRequests[i].MethodInfoId == methodInfoAnswer.MethodInfoId)
                        {
                            // We got the answer for a method info
                            pendingCallRequest = pendingRequests[i];
                            pendingRequests.RemoveAt(i);
                        }
                    }
                }
                if (pendingCallRequest != null)
                {
                    result = callHandler.HandleCallRequest(pendingCallRequest);
                }
                break;

            // ---- ConnectionInfo ----
            case MessageId.ConnectionInfoRequest:
                result = HandleConnectionInfoRequest((ConnectionInfoRequest)message);
                break;

            case MessageId.ConnectionInfoAnswer:
                HandleConnectionInfoAnswer((ConnectionInfoAnswer)message);
                break;

            default:
                string errorMsg = string.Format("Messages of Id={0} and type={1} are not supported", message.Id, message.GetType());
                throw new NotSupportedException(errorMsg);
            }
            return(result);
        }
コード例 #8
0
 public override void HandleMessage(AMessage message, VSPCContext context)
 {
     if (message is UserClickedLoginMessage)
     {
         Connect((UserClickedLoginMessage)message, context);
     }
     else if (message is UserClickedLogoffMessage)
     {
         Disconnect((UserClickedLogoffMessage)message, context);
     }
     else if (message is PositionReportMessage)
     {
         SendPositionReportToFSDServer((PositionReportMessage)message, context);
     }
     else if (message is ErrorMessage)
     {
         Logger.Error("FSD Error received: {0} {1} {2}", ((ErrorMessage)message).ErrorCode, ((ErrorMessage)message).ErrorInfo, ((ErrorMessage)message).ErrorText);
     }
     else if (message is VSPC.Core.Messages.FLSIM.FlightsimConnectedMessage)
     {
         context.FlightsimIsConnected = true;
     }
     else if (message is VSPC.Core.Messages.FLSIM.FlightsimDisconnectedMessage)
     {
         context.FlightsimIsConnected = false;
     }
     else if (message is TextMessageSend)
     {
         SendTextMessage((TextMessageSend)message);
     }
     else
     {
         Logger.Error("Unexpected message type received in FSDMessageHandler: " + message.GetType().Name);
     }
 }