Beispiel #1
0
        public AmpMessage Decode(IBufferReader reader)
        {
            if (reader.ReadableBytes == 0)
            {
                return(null);
            }
            AmpMessage msg = new AmpMessage();

            if (reader.ReadableBytes < 10)
            {
                throw new Rpc.Exceptions.RpcCodecException("消息不正确,小于头长度");
            }
            msg.Version = reader.ReadByte();
            int length = reader.ReadInt();

            msg.Sequence = reader.ReadInt();
            byte type = reader.ReadByte();

            msg.InvokeMessageType = InvokeMessageTypeParser.Parse(type);
            msg.ServiceId         = reader.ReadUShort();
            msg.MessageId         = reader.ReadUShort();

            int left = length - 14;

            if (left > 0)
            {
                if (left > reader.ReadableBytes)
                {
                    throw new Rpc.Exceptions.RpcCodecException("消息长度不正确");
                }
                msg.Data = new byte[left];
                reader.ReadBytes(msg.Data);
            }
            return(msg);
        }
Beispiel #2
0
        public AmpMessage Decode(IBufferReader reader)
        {
            if (reader.ReadableBytes == 0)
            {
                return(null);
            }
            AmpMessage msg = new AmpMessage();

            if (reader.ReadableBytes < AmpMessage.HEAD_LENGTH)
            {
                throw new Rpc.Exceptions.RpcCodecException($"decode error ,ReadableBytes={reader.ReadableBytes},HEAD_LENGTH={AmpMessage.HEAD_LENGTH}");
            }
            msg.Version = reader.ReadByte();
            int length = reader.ReadInt();

            msg.Sequence = reader.ReadInt();
            byte type = reader.ReadByte();

            msg.InvokeMessageType = Rpc.Utils.ParseUtils.ParseMessageType(type);
            msg.ServiceId         = reader.ReadUShort();
            msg.MessageId         = reader.ReadUShort();
            msg.Code = reader.ReadInt();

            int left = length - AmpMessage.HEAD_LENGTH;

            if (left > 0)
            {
                if (left > reader.ReadableBytes)
                {
                    throw new Rpc.Exceptions.RpcCodecException("消息长度不正确");
                }
                msg.Data = new byte[left];
                reader.ReadBytes(msg.Data);
            }
            return(msg);
        }
Beispiel #3
0
        public AmpMessage Parse(IBufferReader reader)
        {
            if (reader.ReadableBytes == 0)
            {
                return(null);
            }

            var msg = new AmpMessage {
                Version = reader.ReadByte()
            };

            int headLength;

            if (msg.Version == 0)
            {
                headLength = AmpMessage.VERSION_0_HEAD_LENGTH;
                if (reader.ReadableBytes < AmpMessage.VERSION_0_HEAD_LENGTH - 1)
                {
                    throw new RpcCodecException($"decode error ,ReadableBytes={reader.ReadableBytes+1},HEAD_LENGTH={AmpMessage.VERSION_0_HEAD_LENGTH}");
                }
            }
            else if (msg.Version == 1)
            {
                headLength = AmpMessage.VERSION_1_HEAD_LENGTH;
                if (reader.ReadableBytes < AmpMessage.VERSION_1_HEAD_LENGTH - 1)
                {
                    throw new RpcCodecException($"decode error ,ReadableBytes={reader.ReadableBytes+1},HEAD_LENGTH={AmpMessage.VERSION_1_HEAD_LENGTH}");
                }
            }
            else
            {
                throw new RpcCodecException($"decode error ,{msg.Version} is not support");
            }

            var length = reader.ReadInt();

            msg.Sequence = reader.ReadInt();
            var type = reader.ReadByte();

            msg.InvokeMessageType = (InvokeMessageType)Enum.ToObject(typeof(InvokeMessageType), type);


            msg.ServiceId = msg.Version == 0 ? reader.ReadUShort() : reader.ReadInt();


            msg.MessageId = reader.ReadUShort();
            msg.Code      = reader.ReadInt();

            if (msg.Version == 1)
            {
                byte codeType = reader.ReadByte();
                if (codeType != this._serializer.CodecType)
                {
                    throw  new RpcCodecException($"CodecType:{codeType} is not Match {this._serializer.CodecType}");
                }
                msg.CodecType = (CodecType)Enum.ToObject(typeof(CodecType), codeType);
            }
            else
            {
                msg.CodecType = CodecType.Protobuf;
            }

            int left = length - headLength;

            if (left > 0)
            {
                if (left > reader.ReadableBytes)
                {
                    throw new RpcCodecException("message not long enough!");
                }
                msg.Data = new byte[left];
                reader.ReadBytes(msg.Data);
            }
            return(msg);
        }