Created and implemented Packet abstract class

This commit is contained in:
2021-12-15 15:17:00 +10:00
parent cdda6c0c8a
commit a9bc8c4e7d
5 changed files with 303 additions and 30 deletions

View File

@ -1,5 +1,6 @@
using Articulate_Network.Attributes;
using Articulate_Network.Interfaces;
using Articulate_Network.Packets;
using System;
using System.Collections.Generic;
using System.Diagnostics;
@ -14,7 +15,7 @@ namespace Articulate_Network.Managers
public class PacketManager : IManager
{
Dictionary<Type, List<PropertyInfo>> packetInfo = new Dictionary<Type, List<PropertyInfo>>();
Dictionary<Type, IPacket> packetInstances = new Dictionary<Type, IPacket>();
Dictionary<string, Packet> packetInstances = new Dictionary<string, Packet>();
public void Initialize()
{
@ -22,13 +23,13 @@ namespace Articulate_Network.Managers
foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
{
var managersFound = assembly.GetTypes().Where(t => @interface.IsAssignableFrom(t) && !t.IsAbstract);
var packetsFound = assembly.GetTypes().Where(t => @interface.IsAssignableFrom(t) && !t.IsAbstract);
foreach (var p in managersFound)
foreach (var p in packetsFound)
{
var packet = (IPacket)Activator.CreateInstance(p);
var packet = (Packet)Activator.CreateInstance(p);
packetInstances.Add(p, packet);
packetInstances.Add(p.Name, packet);
LoadPacketInfo(packet);
}
}
@ -41,7 +42,7 @@ namespace Articulate_Network.Managers
packetInfo.Add(packet.GetType(), packet.GetType().GetProperties().Where(f => !Attribute.IsDefined(f, typeof(PacketIgnore))).OrderBy(f => f.Name).ToList());
}
public T Send<T>(IPacket packet)
public void Send(Packet packet)
{
Stopwatch watch = new Stopwatch();
watch.Start();
@ -57,19 +58,24 @@ namespace Articulate_Network.Managers
var serialized = SerializePacket(packet);
var deserialized = DeserializePacket<T>(serialized);
//var deserialized = DeserializePacket<T>(serialized);
return (T)deserialized;
//return (T)deserialized;
}
public MemoryStream SerializePacket(IPacket packet)
public byte[] SerializePacket(Packet packet)
{
if (!packetInfo.ContainsKey(packet.GetType()))
LoadPacketInfo(packet);
Stopwatch watch = new Stopwatch();
watch.Start();
var fields = packetInfo[packet.GetType()];
MemoryStream memoryStream = new MemoryStream();
BinaryWriter binaryWriter = new BinaryWriter(memoryStream);
MemoryStream buffer = new MemoryStream();
BinaryWriter binaryWriter = new BinaryWriter(buffer);
binaryWriter.Write(packet.GetType().Name);
foreach (var field in fields)
{
@ -79,27 +85,57 @@ namespace Articulate_Network.Managers
if (field.PropertyType == typeof(int))
binaryWriter.Write((int)field.GetValue(packet));
if (field.PropertyType == typeof(long))
binaryWriter.Write((long)field.GetValue(packet));
if (field.PropertyType == typeof(string))
binaryWriter.Write((string)field.GetValue(packet));
binaryWriter.Write(((string)field.GetValue(packet)) ?? string.Empty);
if (field.PropertyType.IsEnum)
binaryWriter.Write((int)field.GetValue(packet));
if (field.PropertyType == typeof(byte[]))
{
byte[] buf = (byte[])field.GetValue(packet);
binaryWriter.Write(buf.Length);
binaryWriter.Write(buf);
}
//Console.WriteLine(field.Name);
}
memoryStream.Position = 0;
long length = buffer.Length;
byte[] packetData = buffer.ToArray();
buffer.SetLength(0);
binaryWriter.Write(length);
binaryWriter.Write(packetData);
binaryWriter.Write(length);
watch.Stop();
Console.WriteLine($"Serialize time: {watch.ElapsedTicks / 10} microseconds");
return memoryStream;
//Console.WriteLine($"Serialize time: {watch.ElapsedTicks / 10} microseconds");
return buffer.ToArray();
}
public T DeserializePacket<T>(Stream stream)
public Packet DeserializePacket(MemoryStream stream)
{
Stopwatch watch = new Stopwatch();
watch.Start();
IPacket packet = /*packetInstances[typeof(T)];*/(IPacket)Activator.CreateInstance(typeof(T));
var fields = packetInfo[typeof(T)];
BinaryReader reader = new BinaryReader(stream);
string typeName = reader.ReadString();
Console.WriteLine(typeName);
Packet packet = packetInstances[typeName];/*(IPacket)Activator.CreateInstance(typeof(T));*/
var fields = packetInfo[packet.GetType()];
//Console.WriteLine($"Stream length: {stream.Length}");
//Console.WriteLine($"Stream position: {stream.Position}");
foreach (var field in fields)
{
if (field.PropertyType == typeof(bool))
@ -108,15 +144,37 @@ namespace Articulate_Network.Managers
if (field.PropertyType == typeof(int))
field.SetValue(packet, reader.ReadInt32());
if (field.PropertyType == typeof(long))
field.SetValue(packet, reader.ReadInt64());
if (field.PropertyType == typeof(string))
field.SetValue(packet, reader.ReadString());
if (field.PropertyType.IsEnum)
field.SetValue(packet, reader.ReadInt32());
if (field.PropertyType == typeof(byte[]))
{
int length = reader.ReadInt32();
field.SetValue(packet, reader.ReadBytes(length));
}
}
watch.Stop();
Console.WriteLine($"Deserialize time: {watch.ElapsedTicks / 10} microseconds");
//Console.WriteLine($"Deserialize time: {watch.ElapsedTicks / 10} microseconds");
return (T)packet;
return packet;
}
public Packet DeserializePacket(byte[] bytes)
{
return DeserializePacket(new MemoryStream(bytes));
}
public void HandlePacket(Packet packet)
{
Console.WriteLine(packet.GetType().Name);
}
}
}