Пример #1
0
        public void Dispatch(Session session, PacketInfo packetInfo)
        {
            if (OpcodeHelper.IsClientHotfixMessage(packetInfo.Opcode))
            {
                HotfixCallback.Invoke(session, packetInfo);
                return;
            }

            Type     messageType = Game.Scene.GetComponent <OpcodeTypeComponent>().GetType(packetInfo.Opcode);
            IMessage message     = (IMessage)session.Network.MessagePacker.DeserializeFrom(messageType, packetInfo.Bytes, packetInfo.Index, packetInfo.Length);

            // 如果是帧同步消息,交给ClientFrameComponent处理
            FrameMessage frameMessage = message as FrameMessage;

            if (frameMessage != null)
            {
                Game.Scene.GetComponent <ClientFrameComponent>().Add(session, frameMessage);
                return;
            }

            // 普通消息或者是Rpc请求消息
            MessageInfo messageInfo = new MessageInfo(packetInfo.RpcId, packetInfo.Opcode, message);

            Game.Scene.GetComponent <MessageDispatherComponent>().Handle(session, messageInfo);
        }
Пример #2
0
        private void Run(Packet packet)
        {
            if (packet.Length < Packet.MinSize)
            {
                Log.Error($"message error length < {Packet.MinSize}, ip: {this.RemoteAddress}");
                this.Network.Remove(this.Id);
                return;
            }

            byte       flag       = packet.Flag();
            ushort     opcode     = packet.Opcode();
            PacketInfo packetInfo = new PacketInfo
            {
                Opcode = opcode,
                Bytes  = packet.Bytes
            };

            if ((flag & 0xC0) > 0)
            {
                uint rpcId = packet.RpcId();
                packetInfo.RpcId  = rpcId;
                packetInfo.Index  = Packet.RpcIdIndex + 4;
                packetInfo.Length = (ushort)(packet.Length - packetInfo.Index);

                // flag第2位表示这是rpc返回消息
                if ((flag & 0x40) > 0)
                {
                    Action <PacketInfo> action;
                    if (!this.requestCallback.TryGetValue(rpcId, out action))
                    {
                        return;
                    }
                    this.requestCallback.Remove(rpcId);

                    action(packetInfo);
                    return;
                }
            }
            else
            {
                packetInfo.RpcId  = 0;
                packetInfo.Index  = Packet.RpcIdIndex;
                packetInfo.Length = (ushort)(packet.Length - packetInfo.Index);
            }

            this.Network.MessageDispatcher.Dispatch(this, packetInfo);
        }