Files
hjha-server/GameNetModule/GameNet/Base/PacketUtility.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

129 lines
4.8 KiB
C#

using System;
using System.Collections.Concurrent;
using System.IO;
using GameMessage;
using K4os.Compression.LZ4;
using MessagePack;
using MrWu.Debug;
using Server.Core;
namespace Server.Net
{
public static class PacketUtility
{
private static int MaxSendLength = 0;
private const int LogMinLength = 1024 * 100;
public static int MessageParseDataV1(byte[] data, Type messageType, MemoryStream memoryStream)
{
int opcode = MessageManager.GetOpcode(messageType);
memoryStream.Seek(5, SeekOrigin.Begin);
//写入数据
memoryStream.Write(data,0,data.Length);
int length = (int)memoryStream.Position;
memoryStream.GetBuffer()[0] = 0; //设置为不压缩
memoryStream.GetBuffer().WriteTo(1,opcode);
memoryStream.Seek(0, SeekOrigin.Begin);
return length;
}
public static int MessageParseDataV1(MessageData messageData,MemoryStream memoryStream,MemoryStream compressStream)
{
Type messageType = messageData.GetType();
int opcode = MessageManager.GetOpcode(messageType);
compressStream.Seek(0, SeekOrigin.Begin);
MessagePackSerializer.Serialize(messageType,compressStream, messageData);
memoryStream.Seek(5, SeekOrigin.Begin);
byte compressFlag = 0;
if (compressStream.Position < 2048) //2k 一下不压缩
{
memoryStream.Write(compressStream.GetBuffer(),0,(int)compressStream.Position); //把包内容全部写入
}
else
{
//压缩处理
byte[] compressData = LZ4Pickler.Pickle(compressStream.GetBuffer(), 0, (int)compressStream.Position);
memoryStream.WriteInt((int)compressStream.Position); //写入压缩前的长度
memoryStream.Write(compressData,0,compressData.Length);
compressFlag = 1;
//Debug.Info($"得到数据:{compressData.Length} {compressData[0]} {compressData[compressData.Length - 1]}");
}
int length = (int)memoryStream.Position;
memoryStream.GetBuffer()[0] = compressFlag;
memoryStream.GetBuffer().WriteTo(1,opcode);
memoryStream.Seek(0, SeekOrigin.Begin);
return length;
}
public static byte[] MessageParseData(Type messageType,byte[] data)
{
int opcode = MessageManager.GetOpcode(messageType);
int len = 4 + 4 + data.Length;
//包长度
byte[] lenData = BitConverter.GetBytes(len);
//包类型
byte[] opcodeData = BitConverter.GetBytes(opcode);
//备用 4个字节
byte[] bakData = BitConverter.GetBytes(0);
//发送的数据
byte[] sendData = new byte[len + 4];
if (len > MaxSendLength)
{
MaxSendLength = len;
if (MaxSendLength > LogMinLength)
{
Debug.ImportantLog($"当前最大发送数据长度:{MaxSendLength},opcode:{opcode}");
}
}
Buffer.BlockCopy(lenData, 0, sendData, 0, 4);
Buffer.BlockCopy(opcodeData, 0, sendData, 4, 4);
Buffer.BlockCopy(bakData, 0, sendData, 8, 4);
Buffer.BlockCopy(data, 0, sendData, 12, data.Length);
return sendData;
}
public static byte[] MessageParseData(MessageData messageData)
{
Type messageType = messageData.GetType();
int opcode = MessageManager.GetOpcode(messageType);
byte[] data = MessagePackSerializer.Serialize(messageType, messageData);
int len = 4 + 4 + data.Length;
//包长度
byte[] lenData = BitConverter.GetBytes(len);
//包类型
byte[] opcodeData = BitConverter.GetBytes(opcode);
//备用 4个字节
byte[] bakData = BitConverter.GetBytes(0);
//发送的数据
byte[] sendData = new byte[len + 4];
if (len > MaxSendLength)
{
MaxSendLength = len;
if (MaxSendLength > LogMinLength)
{
Debug.ImportantLog($"当前最大发送数据长度:{MaxSendLength},opcode:{opcode}");
}
}
Buffer.BlockCopy(lenData, 0, sendData, 0, 4);
Buffer.BlockCopy(opcodeData, 0, sendData, 4, 4);
Buffer.BlockCopy(bakData, 0, sendData, 8, 4);
Buffer.BlockCopy(data, 0, sendData, 12, data.Length);
return sendData;
}
}
}