/// <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(); }
/// <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); }
/// <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(); }