Example #1
0
        /// <summary>
        /// 解码
        /// </summary>
        public override void Decode(ByteBuffer receiveBuffer, List <System.Object> outputResult)
        {
            // 循环解包
            while (true)
            {
                // 如果数据不够一个SIZE
                if (receiveBuffer.ReadableBytes < (int)PackageSizeFieldType)
                {
                    break;
                }

                receiveBuffer.MarkReaderIndex();

                // 读取Package长度
                int packageSize;
                if (PackageSizeFieldType == EPackageSizeFieldType.UShort)
                {
                    packageSize = receiveBuffer.ReadUShort();
                }
                else
                {
                    packageSize = receiveBuffer.ReadInt();
                }

                // 如果剩余可读数据小于Package长度
                if (receiveBuffer.ReadableBytes < packageSize)
                {
                    receiveBuffer.ResetReaderIndex();
                    break;                     //需要退出读够数据再解包
                }

                DefaultNetworkPackage package = new DefaultNetworkPackage();

                // 读取包头
                {
                    // 读取消息ID
                    if (MessageIDFieldType == EMessageIDFieldType.UShort)
                    {
                        package.MsgID = receiveBuffer.ReadUShort();
                    }
                    else
                    {
                        package.MsgID = receiveBuffer.ReadInt();
                    }
                }

                // 检测包体长度
                int bodySize = packageSize - (int)MessageIDFieldType;
                if (bodySize > PackageBodyMaxSize)
                {
                    HandleError(true, $"The package {package.MsgID} size is larger than {PackageBodyMaxSize} !");
                    break;
                }

                // 正常解包
                try
                {
                    // 读取包体
                    byte[] bodyData = receiveBuffer.ReadBytes(bodySize);

                    Type classType = NetworkMessageRegister.TryGetMessageType(package.MsgID);
                    if (classType != null)
                    {
                        // 非热更协议
                        package.MsgObj = DecodeInternal(classType, bodyData);
                        if (package.MsgObj != null)
                        {
                            outputResult.Add(package);
                        }
                    }
                    else
                    {
                        // 热更协议
                        package.IsHotfixPackage = true;
                        package.BodyBytes       = bodyData;
                        outputResult.Add(package);
                    }
                }
                catch (Exception ex)
                {
                    // 解包异常后继续解包
                    HandleError(false, $"The package {package.MsgID} decode error : {ex.ToString()}");
                }
            }             //while end

            // 注意:将剩余数据移至起始
            receiveBuffer.DiscardReadBytes();
        }
Example #2
0
        /// <summary>
        /// 编码
        /// </summary>
        public override void Encode(ByteBuffer sendBuffer, System.Object packageObj)
        {
            DefaultNetworkPackage package = (DefaultNetworkPackage)packageObj;

            if (package == null)
            {
                HandleError(false, $"The package object is invalid : {packageObj.GetType()}");
                return;
            }

            // 检测逻辑是否合法
            if (package.IsHotfixPackage)
            {
                if (package.BodyBytes == null)
                {
                    HandleError(false, $"The package BodyBytes field is null : {packageObj.GetType()}");
                    return;
                }
            }
            else
            {
                if (package.MsgObj == null)
                {
                    HandleError(false, $"The package MsgObj field is null : {packageObj.GetType()}");
                    return;
                }
            }

            // 获取包体数据
            byte[] bodyData;
            if (package.IsHotfixPackage)
            {
                bodyData = package.BodyBytes;
            }
            else
            {
                bodyData = EncodeInternal(package.MsgObj);
            }

            // 检测包体长度
            if (bodyData.Length > PackageBodyMaxSize)
            {
                HandleError(false, $"The package {package.MsgID} body size is larger than NetworkDefine.PackageBodyMaxSize");
                return;
            }

            // 写入长度
            int packetSize = (int)MessageIDFieldType + bodyData.Length;

            if (PackageSizeFieldType == EPackageSizeFieldType.UShort)
            {
                // 检测是否越界
                if (packetSize > ushort.MaxValue)
                {
                    HandleError(true, $"The package {package.MsgID} size is larger than ushort.MaxValue.");
                    return;
                }
                sendBuffer.WriteUShort((ushort)packetSize);
            }
            else
            {
                sendBuffer.WriteInt(packetSize);
            }

            // 写入包头
            {
                // 写入消息ID
                if (MessageIDFieldType == EMessageIDFieldType.UShort)
                {
                    // 检测是否越界
                    if (package.MsgID > ushort.MaxValue)
                    {
                        HandleError(true, $"The package {package.MsgID} ID is larger than ushort.MaxValue");
                        return;
                    }
                    sendBuffer.WriteUShort((ushort)package.MsgID);
                }
                else
                {
                    sendBuffer.WriteInt(package.MsgID);
                }
            }

            // 写入包体
            sendBuffer.WriteBytes(bodyData, 0, bodyData.Length);
        }
Example #3
0
        /// <summary>
        /// 解码
        /// </summary>
        public override void Decode(ByteBuffer receiveBuffer, List <INetworkPackage> receivePackages)
        {
            // 循环解包
            while (true)
            {
                // 如果数据不够一个SIZE
                if (receiveBuffer.ReadableBytes < (int)PackageSizeFieldType)
                {
                    break;
                }

                receiveBuffer.MarkReaderIndex();

                // 读取Package长度
                int packageSize;
                if (PackageSizeFieldType == EPackageSizeFieldType.UShort)
                {
                    packageSize = receiveBuffer.ReadUShort();
                }
                else
                {
                    packageSize = receiveBuffer.ReadInt();
                }

                // 如果剩余可读数据小于Package长度
                if (receiveBuffer.ReadableBytes < packageSize)
                {
                    receiveBuffer.ResetReaderIndex();
                    break;                     //需要退出读够数据再解包
                }

                DefaultNetworkPackage package = new DefaultNetworkPackage();

                // 读取包头
                {
                    // 读取消息ID
                    if (MessageIDFieldType == EMessageIDFieldType.UShort)
                    {
                        package.MsgID = receiveBuffer.ReadUShort();
                    }
                    else
                    {
                        package.MsgID = receiveBuffer.ReadInt();
                    }
                }

                // 检测包体长度
                int bodySize = packageSize - (int)MessageIDFieldType;
                if (bodySize > PackageBodyMaxSize)
                {
                    HandleError(true, $"The package {package.MsgID} size is larger than {PackageBodyMaxSize} !");
                    break;
                }

                // 读取包体
                try
                {
                    package.BodyBytes = receiveBuffer.ReadBytes(bodySize);
                    receivePackages.Add(package);
                }
                catch (Exception ex)
                {
                    // 解包异常后继续解包
                    HandleError(false, $"The package {package.MsgID} decode error : {ex.ToString()}");
                }
            }             //while end

            // 注意:将剩余数据移至起始
            receiveBuffer.DiscardReadBytes();
        }