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
129 lines
4.8 KiB
C#
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;
|
|
}
|
|
}
|
|
} |