コード例 #1
0
ファイル: MessageHelper.cs プロジェクト: 526077247/ET
 public static void Broadcast(Unit unit, IActorMessage message)
 {
     foreach (var u in unit.GetBeSeeUnits())
     {
         SendToClient(u.GetParent <Unit>(), message);
     }
 }
コード例 #2
0
        public static void Broadcast(IActorMessage message)
        {
            Unit[] units = Game.Scene.GetComponent <UnitComponent>().GetAll();
            //actor位置发送组件
            ActorMessageSenderComponent actorLocationSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>();

            //遍历每一个单位
            foreach (Unit unit in units)
            {
                //获取到它们的网关组件  里面存储的是网关服务器里的Session Id 用于跟客户端进行通信的
                UnitGateComponent unitGateComponent = unit.GetComponent <UnitGateComponent>();
                if (unitGateComponent.IsDisconnect)
                {
                    continue;
                }
                //通过网关sessionID找到 玩家是在哪个网关服务器(进程)
                ActorMessageSender actorMessageSender = actorLocationSenderComponent.Get(unitGateComponent.GateSessionActorId);
                //内部就去进行创建会话实体 连接到网关.. 将消息发送给网关 网关那边去处理一下就好了..
                //不过demo里并没有看到网关有处理这条协议
                actorMessageSender.Send(message);

                //建议:其实进程之间的通信,是通过socket来实现的,那维护好对应的socket不就行了
                //最好省去各种由Id找到另一个Id的逻辑,不利于应对后续的变化
            }
        }
コード例 #3
0
        public void SendMessage(IActorMessage message)
        {
            // EthanDebug
            //if(message is M2C_MapUnitCreate m2C_MapUnitCreate)
            //{
            //    for(int i = 0; i < ReceviceMambers.Count; i++)
            //    {
            //        m2C_MapUnitCreate.MapUnitInfo.DebugId = IdGenerater.GenerateId();
            //        var rev = ReceviceMambers[i];

            //        BsonDocument doc = new BsonDocument
            //        {
            //            { "Block.room.Id" , Block?.room?.Id },
            //            { "Block.roomId" , Block?.roomId },
            //            { "Block.blockId" , Block?.blockId },
            //            { "rev.Id" , rev?.Id },
            //            { "rev.MapAppId" , IdGenerater.GetAppId(rev == null ? 0 : rev.Id) },
            //            { "rev.Uid" , rev?.Uid },
            //            { "rev.RoomId" , rev?.RoomId },
            //            { "rev.Room.Id" , rev?.Room?.Id },
            //            { "rev.Block.room.Id" , rev?.Block?.room?.Id },
            //            { "rev.Block.roomId" , rev?.Block?.roomId },
            //            { "rev.Block.blockId" , rev?.Block?.blockId },
            //            { "sendToList", ReceviceMambers.Select(e => $"MapUnitId:{e.Id}, Uid:{e.Uid}, BlockId:{e.Block?.blockId}").ToJson() }
            //        };
            //        Log.Trace($"DebugId[{m2C_MapUnitCreate.MapUnitInfo.DebugId}]> {doc.ToJson()}");
            //    }
            //}
            MapMessageHelper.BroadcastTarget(message, ReceviceMambers);
        }
コード例 #4
0
ファイル: MessageHelper.cs プロジェクト: 526077247/ET
 public static void SendToClient(Unit unit, IActorMessage message)
 {
     if (unit.GetComponent <UnitGateComponent>() != null)
     {
         SendActor(unit.GetComponent <UnitGateComponent>().GateSessionActorId, message);
     }
 }
コード例 #5
0
        public async Task Handle(Session session, Entity entity, IActorMessage actorMessage)
        {
            ActorResponse actorResponse = new ActorResponse
            {
                RpcId = actorMessage.RpcId
            };

            try
            {
                // 发送给客户端
                Session clientSession = entity as Session;
                actorMessage.ActorId = 0;
                clientSession.Send(actorMessage);

                session.Reply(actorResponse);
                await Task.CompletedTask;
            }
            catch (Exception e)
            {
                actorResponse.Tag     = ErrorCode.ERR_SessionActorError;
                actorResponse.Message = $"session actor error {e}";
                session.Reply(actorResponse);
                throw;
            }
        }
コード例 #6
0
        public void AddMessage(IActorMessage msg)
        {
            try
            {
                EventData eventData = SendBytesToEventHub.BuildMessage <MsgType>(msg);
                EventHubClient.Send(eventData);

                if (null == msg.Status)
                {
                    msg.Status = new TaskCompletionSource <IActorMessage>();
                }

                msg.Status?.SetResult(new EventHubMessage(eventData));
            }
            catch (Exception ex)
            {
                Exception foundEx = null;
                var       handler = this.FindExceptionHandler(_exceptionTypeToHandler, ex, out foundEx);

                if (null != handler)
                {
                    handler.Invoke(foundEx);
                }

                if (null != msg.Status && !msg.Status.Task.IsCanceled)
                {
                    msg.Status.TrySetException(ex);
                }
            }
        }
コード例 #7
0
        public static void Broadcast(IActorMessage message)
        {
            //广播事件
            Ship[] ships = Game.Scene.GetComponent <ShipComponent>().GetAll();
            ActorMessageSenderComponent actorLocationSenderComponent = Game.Scene.GetComponent <ActorMessageSenderComponent>();

            foreach (Ship ship in ships)
            {
                ShipGateComponent shipGateComponent = ship.GetComponent <ShipGateComponent>();
                if (shipGateComponent.IsDisconnect)
                {
                    continue;
                }

                ActorMessageSender actorMessageSender = actorLocationSenderComponent.Get(shipGateComponent.GateSessionActorId);
                actorMessageSender.Send(message);
            }

            //Unit[] units = Game.Scene.GetComponent<UnitComponent>().GetAll();
            //ActorMessageSenderComponent actorLocationSenderComponent = Game.Scene.GetComponent<ActorMessageSenderComponent>();
            //foreach (Unit unit in units)
            //{
            //	UnitGateComponent unitGateComponent = unit.GetComponent<UnitGateComponent>();
            //	if (unitGateComponent.IsDisconnect)
            //	{
            //		continue;
            //	}

            //	ActorMessageSender actorMessageSender = actorLocationSenderComponent.Get(unitGateComponent.GateSessionActorId);
            //	actorMessageSender.Send(message);
            //}
        }
コード例 #8
0
        public static async ETVoid HandleIActorMessage(Session session, IActorMessage iActorMessage)
        {
            long replyId = IdGenerater.GetProcessId(iActorMessage.ActorId);

            iActorMessage.ActorId = iActorMessage.ActorId & IdGenerater.HeadMask | IdGenerater.Head;

            Entity entity = Game.EventSystem.Get(iActorMessage.ActorId);

            if (entity == null)
            {
                Log.Error($"not found actor: {MongoHelper.ToJson(iActorMessage)}");
                return;
            }

            MailBoxComponent mailBoxComponent = entity.GetComponent <MailBoxComponent>();

            if (mailBoxComponent == null)
            {
                Log.Error($"actor not add MailBoxComponent: {entity.GetType().Name} {iActorMessage}");
                return;
            }

            Session ss = NetInnerComponent.Instance.Get(replyId);
            await mailBoxComponent.Handle(ss, iActorMessage);
        }
コード例 #9
0
        private void ProcessIActorMessageMessagePump(object state)
        {
            bool          useThreadPool = ((bool)state);
            IActorMessage msg           = null;

            _actorRegistered.WaitOne();
            _actorRegistered.Set();

            for (;;)
            {
                msg = GetNextMessage();

                if (ShouldExit())
                {
                    return;
                }

                if (null == msg)
                {
                    continue;
                }

                if (typeof(ControlMessages.HangUp) == msg.GetType())
                {
                    if (null != msg.Status && !msg.Status.Task.IsCompleted)
                    {
                        msg.Status.SetResult(msg);
                    }
                    //this.Disable();
                    return;
                }

                Interlocked.Increment(ref tellingCount);

                if (useThreadPool)
                {
                    System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(ProcessIActorMessageOnThreadPoolFcn), msg);
                }
                else
                {
                    IActor actor = null;

                    try
                    {
                        actor = GetActorForMessage(msg);

                        if (null == actor)
                        {
                            throw new NoActorForMessageTypeException(msg.GetType().FullName);
                        }

                        ProcessIActorMessage(ref actor, msg);
                    }
                    catch (Exception ex)
                    {
                        CheckForAndRunExceptionHandler(ex, actor, msg);
                    }
                }
            }
        }
コード例 #10
0
 //给房间内的所有玩家广播消息
 public static void BroadcastMssagePlayers(this FiveStarRoom fiveStarRoom, IActorMessage iActorMessage)
 {
     foreach (var player in fiveStarRoom.FiveStarPlayerDic.Values)
     {
         player.SendMessageUser(iActorMessage);
     }
 }
コード例 #11
0
        public static void Send(this ActorMessageSender self, IActorMessage message)
        {
            Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(self.Address);

            message.ActorId = self.ActorId;
            session.Send(message);
        }
コード例 #12
0
 //给房间内的所有玩家广播消息
 public static void BroadcastMssagePlayers(this JoyLdsRoom joyLdsRoom, IActorMessage iActorMessage)
 {
     foreach (var player in joyLdsRoom.pJoyLdsPlayerDic.Values)
     {
         player.SendMessageUser(iActorMessage);
     }
 }
コード例 #13
0
        public static async ETTask Handle(this MailBoxComponent self, Session session, IActorMessage message)
        {
            using (await CoroutineLockComponent.Instance.Wait(CoroutineLockType.Mailbox, message.ActorId))
            {
                switch (self.MailboxType)
                {
                case MailboxType.GateSession:
                    IActorMessage iActorMessage = message as IActorMessage;
                    // 发送给客户端
                    Session clientSession = self.Parent as Session;
                    iActorMessage.ActorId = 0;
                    clientSession.Send(iActorMessage);
                    break;

                case MailboxType.MessageDispatcher:
                    await ActorMessageDispatcherComponent.Instance.Handle(self.Parent, session, message);

                    break;

                case MailboxType.UnOrderMessageDispatcher:
                    self.HandleInner(session, message).Coroutine();
                    break;
                }
            }
        }
コード例 #14
0
        public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
        {
            try
            {
                Request request = actorRequest as Request;
                if (request == null)
                {
                    Log.Error($"消息类型转换错误: {actorRequest.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;
                }

                int rpcId = request.RpcId;
                await this.Run(e, request, response =>
                {
                    // 等回调回来,session可以已经断开了,所以需要判断session id是否为0
                    if (session.IsDisposed)
                    {
                        return;
                    }
                    response.RpcId = rpcId;

                    session.Reply(response);
                });
            }
            catch (Exception e)
            {
                throw new Exception($"解释消息失败: {actorRequest.GetType().FullName}", e);
            }
        }
コード例 #15
0
        public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
        {
            Message msg = actorRequest as Message;

            if (msg == null)
            {
                Log.Error($"消息类型转换错误: {actorRequest.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.IsDisposed)
            {
                return;
            }
            ActorResponse response = new ActorResponse
            {
                RpcId = actorRequest.RpcId
            };

            session.Reply(response);
        }
コード例 #16
0
ファイル: AMActorHandler.cs プロジェクト: tuita520/ETServer
        public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
        {
            Message msg = actorRequest as Message;

            if (msg == null)
            {
                Log.Error($"消息类型转换错误: {actorRequest.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;
            }

            int           rpcId    = actorRequest.RpcId;
            ActorResponse response = new ActorResponse
            {
                RpcId = rpcId
            };

            session.Reply(response);

            await this.Run(e, msg);
        }
コード例 #17
0
        protected bool ProcessIActorMessage(ref IActor actor, IActorMessage msg)
        {
            System.Diagnostics.Debug.Assert(null != actor);

            if (null != msg.Status && msg.Status.Task.IsCanceled)
            {
                return(true);
            }

            if (actor is IHasMailbox)
            {
                actor.OnMessageRecieved(msg);
            }
            else
            {
                actor.OnMessageRecieved(msg);

                if (null != msg.Status && !msg.Status.Task.IsCanceled)
                {
                    if (msg.Message is IActorMessage)
                    {
                        msg.Status.TrySetResult((IActorMessage)msg.Message);
                    }
                    else
                    {
                        msg.Status.TrySetResult(msg);
                    }
                }
            }

            return(true);
        }
コード例 #18
0
 //广播消息
 public static void BroadcastActorMessage(this MatchRoom matchRoom, IActorMessage iActorMessage)
 {
     foreach (var player in matchRoom.PlayerInfoDic)
     {
         player.Value.User.SendeSessionClientActor(iActorMessage);
     }
 }
コード例 #19
0
ファイル: MessageHelper.cs プロジェクト: xfs81150082/TumoET
 /// <summary>
 /// 后来增加群发 , 发给指定的客户端群
 /// </summary>
 /// <param name="message"></param>
 /// <param name="playerUnitId"></param>
 public static void Broadcast(IActorMessage message, long[] playerUnitIds)
 {
     foreach (long pi in playerUnitIds)
     {
         Broadcast(message, pi);
     }
 }
コード例 #20
0
 public static void SendSessionClientActor(this User user, IActorMessage message)
 {
     if (user.GetComponent <UserGateActorIdComponent>() != null)
     {
         long actorId = user.GetComponent <UserGateActorIdComponent>().ActorId;
         ActorHelp.SendActor(actorId, message);
     }
 }
コード例 #21
0
        internal static DirectoryQueueMessage BuildMessage(IActorMessage msg)
        {
            DirectoryQueueMessage cloudMessage = new DirectoryQueueMessage();

            byte[] msgBytes = TempSerialization.GetBytes <MsgType>(msg);
            cloudMessage.SetMessageContent(msgBytes);
            return(cloudMessage);
        }
コード例 #22
0
        public static void Send(this ActorProxy self, IActorMessage message)
        {
            ActorTask task = new ActorTask {
                message = message, proxy = self
            };

            self.Add(task);
        }
コード例 #23
0
        protected virtual IActor GetActorForMessage(IActorMessage msg)
        {
            IActor actor = null;

            _messageTypeToActor.TryGetValue(msg.GetType(), out actor);

            return(actor);
        }
コード例 #24
0
        public bool Print(IActorMessage message)
        {
            Console.WriteLine("Sleeping for 10 seconds");
            System.Threading.Thread.Sleep(100000);

            Console.WriteLine(((IActorMessage)message).Message.ToString());
            return(true);
        }
コード例 #25
0
        public async Task Handle(Session session, Entity entity, IActorMessage actorRequest)
        {
            if (!this.handlers.TryGetValue(actorRequest.GetType(), out IMActorHandler handler))
            {
                throw new Exception($"not found message handler: {MongoHelper.ToJson(actorRequest)}");
            }

            await handler.Handle(session, entity, actorRequest);
        }
コード例 #26
0
ファイル: ActorHelp.cs プロジェクト: z976686281/fivestar
 public static void SendeActor(long actorId, IActorMessage iActorMessage)
 {
     if (actorId == 0)
     {
         return;
     }
     ActorMessageSender actorSender = Game.Scene.GetComponent<ActorMessageSenderComponent>().Get(actorId);
     actorSender.Send(iActorMessage);
 }
コード例 #27
0
        public static void Broadcast(Unit unit, IActorMessage message)
        {
            Dictionary <long, AOIEntity> dict = unit.GetBeSeePlayers();

            foreach (AOIEntity u in dict.Values)
            {
                SendToClient(u.Unit, message);
            }
        }
コード例 #28
0
        public void AddMessage(IActorMessage msg)
        {
            if (msg is ControlMessages.HangUp)
            {
                if (!recieveMessagesOnly)
                {
                    if (null != msg.Status && !msg.Status.Task.IsCompleted)
                    {
                        msg.Status.SetResult(msg);
                    }
                    return;
                }

                hangUp = (msg as ControlMessages.HangUp);
                Kill();
                return;
            }

            if (recieveMessagesOnly)
            {
                throw new Telegraphy.Net.OperatorCannotSendMessagesException();
            }

            // Serialize the message first
            try
            {
                if (msg is MsgType)
                {
                    SerializeAndSend(msg, Queue, (MsgType)msg);
                }
                else if ((msg as IActorMessage).Message is MsgType)
                {
                    SerializeAndSend(msg, Queue, (MsgType)(msg as IActorMessage).Message);
                }
                else
                {
                    throw new DontKnowHowToSerializeTypeException(msg.GetType().ToString());
                }

                if (null != msg.Status && !msg.Status.Task.IsCanceled)
                {
                    msg.Status.TrySetResult(msg);
                }
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.GetType() + ":" + ex.Message + ex.StackTrace);
                Exception foundEx = null;
                var       handler = this.FindExceptionHandler(_exceptionTypeToHandler, ex, out foundEx);

                if (null != handler)
                {
                    handler.Invoke(foundEx);
                }
            }
        }
コード例 #29
0
ファイル: MessageHelper.cs プロジェクト: yzx4036/BodyET
        /// <summary>
        /// 发送协议给Actor
        /// </summary>
        /// <param name="actorId">注册Actor的InstanceId</param>
        /// <param name="message"></param>
        public static void Send(Unit u, IActorMessage message)
        {
            UnitGateComponent unitGateComponent = u.GetComponent <UnitGateComponent>();

            if (unitGateComponent.IsDisconnect)
            {
                return;
            }
            ActorMessageSenderComponent.Instance.Send(unitGateComponent.GateSessionActorId, message);
        }
コード例 #30
0
        public static void Send(this ActorMessageSender self, IActorMessage message)
        {
            Log.Info($"ActorMessageSenderHelper:{self.Address}");
            //连接网关内网服务器
            Session session = Game.Scene.GetComponent <NetInnerComponent>().Get(self.Address);

            message.ActorId = self.ActorId;
            //发送数据
            session.Send(message);
        }