Exemplo n.º 1
0
        private void ProcessBuffer(byte[] data)
        {
            if (mReceiveBuffer == null)
            {
                mReceiveBuffer = Buffer.Create(msgProtocolType);
                mReceiveBuffer.BeginWriting(false).Write(data);
            }
            else
            {
                mReceiveBuffer.BeginWriting(true).Write(data);      //如果之前的包没处理完全,则继续添加
            }
            //首先判断是否收满了一个完整包的最小长度
            for (int available = mReceiveBuffer.size - mOffset; available >= packetLenMin;)
            {
                //计算一个完整包的长度,包括包头和包尾
                if (mExpected == 0)
                {
                    if (msgProtocolType == 1 || msgProtocolType == 2)
                    {
                        mExpected = (int)mReceiveBuffer.PeekUInt32(mOffset + packetHeadLenOffest) + packetLenMin;    //收到的包第3-7个字节为包的长度
                        // Debug.LogWarning(string.Format("cmd: {3}  -- mExpected大小:{0}  --  available大小:{1} -- packetLenMin{2}", mExpected, available,  packetLenMin, mReceiveBuffer.PeekUInt32(0)));
                    }
                    else
                    {
                        mExpected = mReceiveBuffer.PeekUInt16(mOffset + packetHeadLenOffest, true) + packetLenMin;               //收到的包第0-1个字节为整个包包的长度
                        // Debug.LogFormat("bytes={0} expected={1}", bytes,  mExpected);
                    }
                }

                //正好是一个完整包
                if (available == mExpected)
                {
                    if (mOffset > 0)    //如果是多个包的最后一个包
                    {
                        mReceiveBuffer.BeginWriting(false).Write(mReceiveBuffer.buffer, mOffset, (int)mExpected);
                    }
                    EnqueuePacker(mReceiveBuffer);
                    mReceiveBuffer = null;
                    mExpected      = 0;
                    mOffset        = 0;
                    break;
                }
                if (available > mExpected)     //收到大于一个包
                {
                    int    realSize = mExpected;
                    Buffer temp     = Buffer.Create(msgProtocolType);

                    temp.BeginWriting(false).Write(mReceiveBuffer.buffer, mOffset, realSize);
                    EnqueuePacker(temp);

                    temp       = null;
                    available -= mExpected;
                    mOffset   += realSize;
                    mExpected  = 0;
                }
                else
                {
                    break;
                }
            }
        }