Example #1
0
        public BNetHeader(CodedInputStream stream)
        {
            var serviceId = stream.ReadRawByte();
            var methodId  = stream.ReadRawVarint32();
            var requestId = stream.ReadRawByte() | (stream.ReadRawByte() << 8);

            var objectId = 0UL;

            if (serviceId != 0xfe)
            {
                objectId = stream.ReadRawVarint64();
            }
            var payloadLength = stream.ReadRawVarint32();

            this.SetData(serviceId, methodId, requestId, payloadLength, objectId);
        }
Example #2
0
        private static void SkipUnknown(CodedInputStream input, WireType wireType)
        {
            switch (wireType)
            {
            case WireType.None:
                break;

            case WireType.Variant:
                input.ReadRawVarint32();
                break;

            case WireType.Fixed64:
                input.ReadFixed64();
                break;

            case WireType.String:
                input.SkipString();
                break;

            case WireType.StartGroup:
                break;

            case WireType.EndGroup:
                break;

            case WireType.Fixed32:
                input.ReadFixed32();
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
    public static IMessage Decode(byte[] msg)
    {
        IMessage message = null;

        CodedInputStream stream = new CodedInputStream(msg);

        //data length,Protobuf 变长头, 也就是消息长度
        int varint32 = (int)stream.ReadRawVarint32();

        if (varint32 <= (msg.Length - (int)stream.Position))
        {
            try
            {
                byte[] body = stream.ReadRawBytes(varint32);
                message = Message.Parser.ParseFrom(body);
            }
            catch (Exception exception)
            {
                Debug.Log(exception.Message);
            }
        }
        else
        {
            Debug.LogError("网络数据读取不完整,丢包了?");
        }

        return(message);
    }
        //处理粘包(递归) 接收的长度
        private void HandleReceveBytes(byte[] recveBytes, Int32 recelen)
        {
            try
            {
                CodedInputStream inputStream = CodedInputStream.CreateInstance(recveBytes);
                //数据所有长度
                Int32 varint32 = (Int32)inputStream.ReadRawVarint32();
                //获取消息头长度
                Int32 headlength = CodedOutputStream.ComputeRawVarint32Size((uint)varint32);
                //   System.Console.WriteLine("len:" + recelen + "\nvarint32:" + varint32 + "\nlen:" + headlength);
                //如果所有有长度大于接收的长度。断包了
                if (varint32 > recelen - headlength)
                {
                    //需要的长度
                    Int32 needlen = varint32 + headlength - recelen;
                    //已经的长度
                    Int32  haslen = recelen;
                    byte[] resArr = new byte[varint32 + headlength];
                    recveBytes.CopyTo(resArr, 0);

                    while (true)
                    {
                        //
                        byte[] newResult = new byte[needlen];
                        int    len       = clientSocket.Receive(newResult, 0, needlen, SocketFlags.None);
                        //System.Console.WriteLine("len:" + len + "\nhaslen:" + haslen + "\nneedlen:" + needlen);

                        newResult.CopyTo(resArr, haslen);
                        haslen  += len;
                        needlen -= len;

                        if (needlen == 0)
                        {
                            break;
                        }
                    }

                    Thread thread = new Thread(new ParameterizedThreadStart(ReceiveDataHandle));
                    thread.Start(resArr);
                }
                else
                {
                    Thread thread = new Thread(new ParameterizedThreadStart(ReceiveDataHandle));
                    thread.Start(recveBytes);
                    //  ReceiveDataHandle(recveBytes);
                    //如果实际接受的长度大于包体长度+包头长(粘包)
                    if (recelen > (varint32 + headlength))
                    {
                        //剩下的进行解决
                        byte[] res = recveBytes.Skip <byte>(varint32 + headlength).ToArray <byte>();
                        HandleReceveBytes(res, recelen - varint32 - headlength);
                    }
                }
            }
            catch (Exception exc)
            {
                System.Console.WriteLine("接受数据出问题:" + exc);
            }
        }
        private int GetReceivedMessageSize(out byte[] buffer)
        {
            buffer = new byte[MAX_VARINT32_SIZE];
            socket.Receive(buffer);
            CodedInputStream tmp = CodedInputStream.CreateInstance(buffer);

            return((int)tmp.ReadRawVarint32());
        }
        internal static void MergeDelimitedFrom(this IMessage message, Stream input, bool discardUnknownFields, ExtensionRegistry registry)
        {
            ProtoPreconditions.CheckNotNull(message, "message");
            ProtoPreconditions.CheckNotNull(input, "input");
            int    size          = (int)CodedInputStream.ReadRawVarint32(input);
            Stream limitedStream = new LimitedInputStream(input, size);

            MergeFrom(message, limitedStream, discardUnknownFields, registry);
        }
    /// <summary>
    /// 将数据解码
    /// </summary>
    public static void DecodeAsync(byte[] msg)
    {
        if (msg.Length <= 0)
        {
            return;
        }
        //把收取上来的自己全部缓存到本地 buffer 中
        Array.Copy(msg, 0, buffer.Data, buffer.Length, msg.Length);
        buffer.Length += msg.Length;

        Debug.Log(string.Format("cache buff length: {0}, offset: {1}", buffer.Length, buffer.Offset));


        CodedInputStream stream = new CodedInputStream(buffer.Data);

        while (!stream.IsAtEnd)
        {
            //标记读取的Position, 在长度不够时进行数组拷贝,到下一次在进行解析
            int markReadIndex = (int)stream.Position;

            //data length,Protobuf 变长头, 也就是消息长度
            int varint32 = (int)stream.ReadRawVarint32();
            if (varint32 <= (buffer.Length - (int)stream.Position))
            {
                try
                {
                    byte[] body = stream.ReadRawBytes(varint32);

                    Message message = Message.Parser.ParseFrom(body);

                    Debug.Log("Response: " + message.ToString());

                    //TODO: dispatcher message, 这里就可以用多线程进行协议分发
                }
                catch (Exception exception)
                {
                    Debug.Log(exception.Message);
                }
            }
            else
            {
                //本次数据不够长度,缓存进行下一次解析
                byte[] dest       = new byte[8192];
                int    remainSize = buffer.Length - markReadIndex;
                Array.Copy(buffer.Data, markReadIndex, dest, 0, remainSize);

                /**
                 * 缓存未处理完的字节
                 */
                buffer.Data   = dest;
                buffer.Offset = 0;
                buffer.Length = remainSize;
                break;
            }
        }
    }
Example #8
0
        /**
         * 协议解析,把这里搞明白了,就没白看
         */
        public void OnDataReceive(Object sender, DataEventArgs e)
        {
            //DataEventArgs 里面有 byte[] Data是从协议层接收上来的字节数组,需要程序端进行缓存
            Console.WriteLine("buff length: {0}, offset: {1}", e.Length, e.Offset);
            if (e.Length <= 0)
            {
                return;
            }

            //把收取上来的自己全部缓存到本地 buffer 中
            Array.Copy(e.Data, 0, buffer.Data, buffer.Length, e.Length);
            buffer.Length += e.Length;

            CodedInputStream stream = CodedInputStream.CreateInstance(buffer.Data);

            while (!stream.IsAtEnd)
            {
                //标记读取的Position, 在长度不够时进行数组拷贝,到下一次在进行解析
                int markReadIndex = (int)stream.Position;

                //Protobuf 变长头, 也就是消息长度
                int varint32 = (int)stream.ReadRawVarint32();
                if (varint32 <= (buffer.Length - (int)stream.Position))
                {
                    try
                    {
                        byte[] body = stream.ReadRawBytes(varint32);

                        LaidianCommandModel response = LaidianCommandModel.ParseFrom(body);
                        taskMsg.Enqueue(response);
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine(exception.Message);
                    }
                }
                else
                {
                    /**
                     * 本次数据不够长度,缓存进行下一次解析
                     */
                    byte[] dest       = new byte[8192];
                    int    remainSize = buffer.Length - markReadIndex;
                    Array.Copy(buffer.Data, markReadIndex, dest, 0, remainSize);

                    /**
                     * 缓存未处理完的字节
                     */
                    buffer.Data   = dest;
                    buffer.Offset = 0;
                    buffer.Length = remainSize;

                    break;
                }
            }
        }
Example #9
0
 /// <exception cref="System.IO.IOException"/>
 private static byte[][] LoadINodeSection(InputStream @in)
 {
     FsImageProto.INodeSection s = FsImageProto.INodeSection.ParseDelimitedFrom(@in);
     Log.Info("Loading " + s.GetNumInodes() + " inodes.");
     byte[][] inodes = new byte[(int)s.GetNumInodes()][];
     for (int i = 0; i < s.GetNumInodes(); ++i)
     {
         int    size  = CodedInputStream.ReadRawVarint32(@in.Read(), @in);
         byte[] bytes = new byte[size];
         IOUtils.ReadFully(@in, bytes, 0, size);
         inodes[i] = bytes;
     }
     Log.Debug("Sorting inodes");
     Arrays.Sort(inodes, InodeBytesComparator);
     Log.Debug("Finished sorting inodes");
     return(inodes);
 }
Example #10
0
    public static void OnDataReceive2(System.Object sender, DataEventArgs e)
    {
        print("buff length: " + e.Length + ", offset: " + e.Offset);

        if (e.Length <= 0)
        {
            return;
        }

        Array.Copy(e.Data, 0, buffer.Data, buffer.Length, e.Length);
        buffer.Length += e.Length;

        CodedInputStream stream = CodedInputStream.CreateInstance(buffer.Data);

        while (!stream.IsAtEnd)
        {
            int markReadIndex = (int)stream.Position;
            int varint32      = (int)stream.ReadRawVarint32();

            if (varint32 <= (buffer.Length - (int)stream.Position))
            {
                try {
                    byte[] body = stream.ReadRawBytes(varint32);

                    NamePacket response = NamePacket.ParseFrom(body);
                    print("Response: " + response.ToString() + ", count: " + (++count));
                } catch (Exception exception) {
                    print(exception.Message);
                }
            }
            else
            {
                byte[] dest       = new byte[8192];
                int    remainSize = buffer.Length - markReadIndex;
                Array.Copy(buffer.Data, markReadIndex, dest, 0, remainSize);

                buffer.Data   = dest;
                buffer.Offset = 0;
                buffer.Length = remainSize;

                break;
            }
        }
    }
        public ProtobufRequestInfo <TMessage, TBuilder> Filter(byte[] readBuffer, int offset, int length, bool toBeCopied, out int rest)
        {
            rest = 0;
            var readOffset = offset - m_OffsetDelta;

            CodedInputStream stream = CodedInputStream.CreateInstance(readBuffer, readOffset, length);
            var varint32            = (int)stream.ReadRawVarint32();

            if (varint32 <= 0)
            {
                return(null);
            }

            var headLen = (int)stream.Position - readOffset;

            rest = length - varint32 - headLen + m_ParsedLength;

            if (rest >= 0)
            {
                byte[] body = stream.ReadRawBytes(varint32);

                TMessage message     = CreateBuilder().MergeFrom(body).BuildParsed();
                var      requestInfo = new ProtobufRequestInfo <TMessage, TBuilder>(message);
                InternalReset();
                return(requestInfo);
            }
            else
            {
                m_ParsedLength += length;
                m_OffsetDelta   = m_ParsedLength;
                rest            = 0;

                var expectedOffset = offset + length;
                var newOffset      = m_OrigOffset + m_OffsetDelta;

                if (newOffset < expectedOffset)
                {
                    Buffer.BlockCopy(readBuffer, offset - m_ParsedLength + length, readBuffer, m_OrigOffset, m_ParsedLength);
                }

                return(null);
            }
        }
Example #12
0
    private void onData()
    {
        CodedInputStream stream = CodedInputStream.CreateInstance(ioBuff.ToArray());

        if (stream.IsAtEnd)
        {
            isRead = false;
            return;
        }
        // 读取头信息转为int,为body的长度
        int dataSize;

        try
        {
            dataSize = (int)stream.ReadRawVarint32();
        }
        catch (Exception e)
        {
            // 读header失败,有可能是消息不完整,需要等待下一个消息。
            isRead = false;
            return;
        }
        int headerSize = (int)stream.Position;

        // 判断是否已经读到一次完整的信息
        if (dataSize > ioBuff.Count - headerSize)
        {
            //body长度不够 等待下个消息的到来
            isRead = false;
            return;
        }

        // 解析消息体
        byte[]        msg       = stream.ReadRawBytes(dataSize);
        SocketModelPB socketMsg = SocketModelPB.ParseFrom(msg);

        messageList.Add(socketMsg);

        //从消息数组中去掉已经解析完成的数据,保留缓存区的剩余数据
        ioBuff.RemoveRange(0, headerSize + dataSize);
        onData();
    }
Example #13
0
        //接收数据处理
        private void ReceiveDataHandle(object obj)
        {
            byte[] result = (byte[])obj;
            try
            {
                CodedInputStream inputStream = CodedInputStream.CreateInstance(result);
                int varint32 = (int)inputStream.ReadRawVarint32();


                byte[]      body = inputStream.ReadRawBytes(varint32);
                MessagePack pack = MessagePack.ParseFrom(body);
                //  System.Console.WriteLine("pack:"+ pack);
                if (ResultBlockEvent != null)
                {
                    //移除已经不应该存在的方法
                    Delegate[] list = ResultBlockEvent.GetInvocationList();
                    foreach (Delegate de in list)
                    {
                        // System.Console.WriteLine("delegate:" + de.Method.Name + "target:" + de.Target.GetType().ToString());

                        if (de.Target.GetType().IsSubclassOf(typeof(UserControl)))
                        {
                            UserControl control = de.Target as UserControl;
                            if (control.IsDisposed)
                            {
                                ResultBlockEvent -= (de as DataResultBlock);
                            }
                        }
                    }
                    ResultBlockEvent(new ResultModel()
                    {
                        pack  = pack,
                        error = 0,
                    });
                }
            }
            catch (Exception exp)
            {
                System.Console.WriteLine("ReceiveMessage Exception:" + exp.ToString());
            }
        }
Example #14
0
            /// <exception cref="Com.Google.Protobuf.InvalidProtocolBufferException"/>
            private ConcatVectorTable(CodedInputStream input, ExtensionRegistryLite extensionRegistry)
            {
                InitFields();
                int mutable_bitField0_ = 0;

                UnknownFieldSet.Builder unknownFields = UnknownFieldSet.NewBuilder();
                try
                {
                    bool done = false;
                    while (!done)
                    {
                        int tag = input.ReadTag();
                        switch (tag)
                        {
                        case 0:
                        {
                            done = true;
                            break;
                        }

                        default:
                        {
                            if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag))
                            {
                                done = true;
                            }
                            break;
                        }

                        case 8:
                        {
                            if (!((mutable_bitField0_ & unchecked ((int)(0x00000001))) == unchecked ((int)(0x00000001))))
                            {
                                dimensionSize_      = new List <int>();
                                mutable_bitField0_ |= unchecked ((int)(0x00000001));
                            }
                            dimensionSize_.Add(input.ReadInt32());
                            break;
                        }

                        case 10:
                        {
                            int length = input.ReadRawVarint32();
                            int limit  = input.PushLimit(length);
                            if (!((mutable_bitField0_ & unchecked ((int)(0x00000001))) == unchecked ((int)(0x00000001))) && input.GetBytesUntilLimit() > 0)
                            {
                                dimensionSize_      = new List <int>();
                                mutable_bitField0_ |= unchecked ((int)(0x00000001));
                            }
                            while (input.GetBytesUntilLimit() > 0)
                            {
                                dimensionSize_.Add(input.ReadInt32());
                            }
                            input.PopLimit(limit);
                            break;
                        }

                        case 18:
                        {
                            if (!((mutable_bitField0_ & unchecked ((int)(0x00000002))) == unchecked ((int)(0x00000002))))
                            {
                                factorTable_        = new List <ConcatVectorProto.ConcatVector>();
                                mutable_bitField0_ |= unchecked ((int)(0x00000002));
                            }
                            factorTable_.Add(input.ReadMessage(ConcatVectorProto.ConcatVector.Parser, extensionRegistry));
                            break;
                        }
                        }
                    }
                }
                catch (InvalidProtocolBufferException e)
                {
                    throw e.SetUnfinishedMessage(this);
                }
                catch (IOException e)
                {
                    throw new InvalidProtocolBufferException(e.Message).SetUnfinishedMessage(this);
                }
                finally
                {
                    if (((mutable_bitField0_ & unchecked ((int)(0x00000001))) == unchecked ((int)(0x00000001))))
                    {
                        dimensionSize_ = Java.Util.Collections.UnmodifiableList(dimensionSize_);
                    }
                    if (((mutable_bitField0_ & unchecked ((int)(0x00000002))) == unchecked ((int)(0x00000002))))
                    {
                        factorTable_ = Java.Util.Collections.UnmodifiableList(factorTable_);
                    }
                    this.unknownFields = unknownFields.Build();
                    MakeExtensionsImmutable();
                }
            }
Example #15
0
    public static KeyValuePair <byte[], List <Google.Protobuf.IMessage> > Decode(byte[] msg)
    {
        List <Google.Protobuf.IMessage> list = new List <Google.Protobuf.IMessage>();

        CodedInputStream stream = new CodedInputStream(msg);

        bool atkat    = false;
        int  varint32 = 0;

        while (true)
        {
            if (stream.IsAtEnd)
            {
                break;
            }

            try
            {
                varint32 = (int)stream.ReadRawVarint32();
                if (varint32 <= (msg.Length - (int)stream.Position))
                {
                    byte[] body = stream.ReadRawBytes(varint32);

                    list.Add(Packet.Parser.ParseFrom(body));
                }
                else
                {
                    atkat = true;
                    break;
                }
            }
            catch
            {
                break;
            }
        }

        byte[] bytes;
        if (stream.IsAtEnd)
        {
            bytes = new byte[0];
        }
        else
        {
            if (atkat)
            {
                byte[] b = stream.ReadRawBytes(msg.Length - (int)stream.Position);
                bytes = new byte[b.Length + 4];
                byte[] intBytes = BitConverter.GetBytes(varint32);
                Array.Reverse(intBytes);
                Array.Copy(intBytes, bytes, intBytes.Length);
                Array.Copy(b, 0, bytes, intBytes.Length, b.Length);
            }
            else
            {
                bytes = stream.ReadRawBytes(msg.Length - (int)stream.Position);
            }
        }

        return(new KeyValuePair <byte[], List <Google.Protobuf.IMessage> >(bytes, list));
    }