Exemplo n.º 1
0
        public async void Dispatch(Session session, Packet packet)
        {
            ushort opcode      = packet.Opcode();
            Type   messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(opcode);
            object message     = session.Network.MessagePacker.DeserializeFrom(messageType, packet.Bytes, Packet.Index, packet.Length - Packet.Index);

            // 如果是帧指令消息,构造成OneFrameMessage发给对应的unit
            if (message is IFrameMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);

                // 这里设置了帧消息的id,防止客户端伪造
                IFrameMessage iFrameMessage = (IFrameMessage)message;
                iFrameMessage.Id = unitId;

                OneFrameMessage oneFrameMessage = new OneFrameMessage();
                oneFrameMessage.Op       = opcode;
                oneFrameMessage.AMessage = session.Network.MessagePacker.SerializeToByteArray(iFrameMessage);
                actorProxy.Send(oneFrameMessage);
                return;
            }

            // gate session收到actor消息直接转发给actor自己去处理
            if (message is IActorMessage)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);
                actorProxy.Send((IMessage)message);
                return;
            }

            // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
            if (message is IActorRequest aActorRequest)
            {
                long       unitId     = session.GetComponent <SessionPlayerComponent>().Player.UnitId;
                ActorProxy actorProxy = Game.Scene.GetComponent <ActorProxyComponent>().Get(unitId);
                IResponse  response   = await actorProxy.Call(aActorRequest);

                session.Reply(response);
                return;
            }

            if (message != null)
            {
                Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, new MessageInfo(opcode, message));
                return;
            }

            throw new Exception($"message type error: {message.GetType().FullName}");
        }
Exemplo n.º 2
0
        private void UpdateFrame()
        {
            if (this.Queue.Count == 0)
            {
                return;
            }
            SessionFrameMessage sessionFrameMessage = this.Queue.Dequeue();

            this.Frame = sessionFrameMessage.FrameMessage.Frame;

            for (int i = 0; i < sessionFrameMessage.FrameMessage.Messages.Count; ++i)
            {
                IFrameMessage message = (IFrameMessage)sessionFrameMessage.FrameMessage.Messages[i];
                ushort        opcode  = Game.Scene.GetComponent <OpcodeTypeComponent>().GetOpcode(message.GetType());
                Game.Scene.GetComponent <MessageDispatherComponent>().Handle(sessionFrameMessage.Session, new MessageInfo(0, opcode, message));
            }
        }
Exemplo n.º 3
0
        private void EnviarFrame(IFrameMessage mensaje, string MACDestino)
        {
            Frame frameATransmitir = new Frame(mensaje, _puerto.MACAddress, MACDestino);
            if (mensaje is Packet)
                EventPaqueteEncapsulado(frameATransmitir);
            ((IEnvioReciboDatos)_puerto).TransmitirFrame(frameATransmitir);

        }
Exemplo n.º 4
0
 public static void Add(this ServerFrameComponent self, IFrameMessage message)
 {
     self.FrameMessage.Messages.Add((MessageObject)message);
 }
Exemplo n.º 5
0
        public Frame(IFrameMessage informacion, string MACAddressOrigen, string MACAddressDestino)
		{
			_informacion = informacion;
            _MACAddressDestino = MACAddressDestino;
            _MACAddressOrigen = MACAddressOrigen;
		}