Exemplo n.º 1
0
        public void Send(byte nFlag, IMessage rMessage)
        {
            NetworkOpcodeTypes rOpcodeTypes = this.mParent.OpcodeTypes;
            ushort             nOpcode      = rOpcodeTypes.GetOpcode(rMessage.GetType());

            byte[] rBytes = this.mParent.MessagePacker.SerializeToByteArray(rMessage);

            Send(nFlag, nOpcode, rBytes);
        }
Exemplo n.º 2
0
        private void Run(Packet rPacket)
        {
            if (rPacket.Length < Packet.MinSize)
            {
                Debug.LogError($"message error length < {Packet.MinSize}, ip: {this.RemoteAddress}");
                this.mParent.Remove(this.Id);
                return;
            }

            byte   nFlag   = rPacket.Flag;
            ushort nOpcode = rPacket.Opcode;

            if (NetworkOpcodeTypes.IsClientHotfixMessage(nOpcode))
            {
                this.mParent.MessageDispatcher.Dispatch(this, rPacket);
                return;
            }

            // flag第一位为1表示这是rpc返回消息,否则交由MessageDispatcher分发
            if ((nFlag & 0x01) == 0)
            {
                this.mParent.MessageDispatcher.Dispatch(this, rPacket);
                return;
            }

            NetworkOpcodeTypes rOpcodeTypeComponent = this.mParent.OpcodeTypes;
            Type   rResponseType = rOpcodeTypeComponent.GetType(nOpcode);
            object rMessage      = this.mParent.MessagePacker.DeserializeFrom(rResponseType, rPacket.Bytes, Packet.Index, rPacket.Length - Packet.Index);
            //Log.Debug($"recv: {JsonHelper.ToJson(message)}");

            IResponse rResponse = rMessage as IResponse;

            if (rResponse == null)
            {
                throw new Exception($"flag is response, but message is not! {nOpcode}");
            }
            Action <IResponse> rAction;

            if (!this.mRequestCallback.TryGetValue(rResponse.RpcId, out rAction))
            {
                return;
            }
            this.mRequestCallback.Remove(rResponse.RpcId);

            rAction(rResponse);
        }
Exemplo n.º 3
0
        public void Dispatch(NetworkSession rSession, Packet rPacket)
        {
            object rMessage;

            try
            {
                if (NetworkOpcodeTypes.IsClientHotfixMessage(rPacket.Opcode))
                {
                    // 处理热更新的消息分发
                    //if (mHotfixDispatchObject != null)
                    //{
                    //    mHotfixDispatchObject.Invoke("Dispatch", rSession, rPacket);
                    //}
                    return;
                }

                NetworkOpcodeTypes rOpcodeTypes = rSession.Parent.OpcodeTypes;
                Type rResponseType = rOpcodeTypes.GetType(rPacket.Opcode);
                rMessage = rSession.Parent.MessagePacker.DeserializeFrom(rResponseType, rPacket.Bytes, Packet.Index, rPacket.Length - Packet.Index);
            }
            catch (Exception e)
            {
                // 出现任何解析消息异常都要断开Session,防止客户端伪造消息
                Debug.LogError(e);
                rSession.Error = NetworkErrorCode.ERR_PacketParserError;
                rSession.Parent.Remove(rSession.Id);
                return;
            }

            // 如果是帧同步消息,交给ClientFrameComponent处理
            //FrameMessage frameMessage = rMessage as FrameMessage;
            //if (frameMessage != null)
            //{
            //    Game.Scene.GetComponent<ClientFrameComponent>().Add(session, frameMessage);
            //    return;
            //}

            // 普通消息或者是Rpc请求消息
            EventManager.Instance.Distribute(rPacket.Opcode, rMessage);
        }
Exemplo n.º 4
0
        public void Initialize(NetworkProtocol rProtocol)
        {
            this.OpcodeTypes = new NetworkOpcodeTypes();
            this.OpcodeTypes.Initialize();

            this.MessageDispatcher = new NetworkClientDispatcher();
            this.MessagePacker     = new NetworkMessagePacker();

            switch (rProtocol)
            {
            case NetworkProtocol.TCP:
                this.mService = new TService();
                break;

            case NetworkProtocol.KCP:
                this.mService = new KService();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }