using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using SystemX.Core.Communication; namespace HubX.Library.Socket.Packet { public class PacketManager { #region Singleton static PacketManager _instance = new PacketManager(); public static PacketManager Instance { get { return _instance; } } #endregion PacketManager() { Register(); } Dictionary, ushort>> _onRecv = new Dictionary, ushort>>(); Dictionary>> _handler = new Dictionary>>(); public Action, ushort> CustomHandler { get; set; } public void Register() { _onRecv.Add((ushort)EnumMessageId.C2S_INSERT_UniqueKey, MakePacket); _handler.Add((ushort)EnumMessageId.C2S_INSERT_UniqueKey, PacketHandler.C2S_INSERT_UniqueKeyHandler); _onRecv.Add((ushort)EnumMessageId.C2S_SELECT_UniqueKey, MakePacket); _handler.Add((ushort)EnumMessageId.C2S_SELECT_UniqueKey, PacketHandler.C2S_SELECT_UniqueKeyHandler); _onRecv.Add((ushort)EnumMessageId.C2S_UPDATE_UniqueKey, MakePacket); _handler.Add((ushort)EnumMessageId.C2S_UPDATE_UniqueKey, PacketHandler.C2S_UPDATE_UniqueKeyHandler); } public void OnRecvPacket(PacketSession session, ArraySegment buffer) { ushort count = 0; ushort size = BitConverter.ToUInt16(buffer.Array, buffer.Offset); count += 2; ushort id = BitConverter.ToUInt16(buffer.Array, buffer.Offset + count); count += 2; ushort packetSize = (ushort)(buffer.Count - count); byte[] packet = new byte[packetSize]; Array.Copy(buffer.ToArray(), count, packet, 0, packetSize); if (_onRecv.TryGetValue(id, out var action)) action.Invoke(session, packet, id); } void MakePacket(PacketSession session, ArraySegment buffer, ushort id) where T : new() { if (CustomHandler != null) { CustomHandler.Invoke(session, buffer, id); } else { Action> action = null; if (_handler.TryGetValue(id, out action)) action.Invoke(session, buffer); } } public Action> GetPacketHandler(ushort id) { Action> action = null; if (_handler.TryGetValue(id, out action)) return action; return null; } } }