diff --git a/FunGame.Core/Api/Utility/ConcurrentQueue.cs b/FunGame.Core/Api/Utility/ConcurrentQueue.cs new file mode 100644 index 0000000..5ffe49c --- /dev/null +++ b/FunGame.Core/Api/Utility/ConcurrentQueue.cs @@ -0,0 +1,38 @@ +namespace Milimoe.FunGame.Core.Api.Utility +{ + public class ConcurrentQueue + { + public bool Lock { get; set; } + + private System.Collections.Concurrent.ConcurrentQueue Instance { get; } + + public ConcurrentQueue() + { + Instance = new System.Collections.Concurrent.ConcurrentQueue(); + } + + public void Add(T obj) + { + if (Lock) + { + return; + } + Lock = true; + lock (Instance) + { + Instance.Enqueue(obj); + } + } + + public bool Delete() + { + bool result = false; + lock (Instance) + { + result = Instance.TryDequeue(out _); + } + Lock = false; + return result; + } + } +} diff --git a/FunGame.Core/Library/Common/Architecture/DataRequest.cs b/FunGame.Core/Library/Common/Architecture/DataRequest.cs new file mode 100644 index 0000000..b347dd6 --- /dev/null +++ b/FunGame.Core/Library/Common/Architecture/DataRequest.cs @@ -0,0 +1,97 @@ +using System.Collections; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Library.Common.Network; +using Milimoe.FunGame.Core.Library.Constant; + +namespace Milimoe.FunGame.Core.Library.Common.Architecture +{ + public class DataRequest + { + private static readonly ConcurrentQueue Queue = new(); + private readonly Request Worker; + + public DataRequest(Socket Socket, DataRequestType RequestType) + { + Worker = new(Socket, RequestType); + } + + public void AddRequestData(string key, object value) + { + Worker.RequestData.Add(key, value); + } + + public async Task SendRequest() + { + Queue.Add(Worker); + if (await Worker.SendRequest() == RequestResult.Success) + { + Queue.Delete(); + } + } + + public object? this[string key] => Worker.ResultData[key]; + + public T? GetResult(string key) + { + object? obj = this[key]; + if (obj != null) + { + return (T)obj; + } + return default; + } + + private class Request : BaseModel + { + public Hashtable RequestData { get; } = new(); + public Hashtable ResultData { get; } = new(); + + private bool JobFinish = false; + private readonly Socket? Socket; + private readonly DataRequestType RequestType; + + public async Task SendRequest() + { + try + { + if (Socket?.Send(SocketMessageType.DataRequest, RequestData) == SocketResult.Success) + { + await Task.Run(() => + { + while (true) + { + if (JobFinish) break; + Thread.Sleep(100); + } + }); + } + } + catch + { + return RequestResult.Fail; + } + return RequestResult.Success; + } + + public Request(Socket? socket, DataRequestType requestType) : base(socket) + { + Socket = socket; + RequestType = requestType; + } + + public override void SocketHandler(SocketObject SocketObject) + { + if (SocketObject.SocketType == SocketMessageType.DataRequest) + { + Dispose(); + switch (RequestType) + { + default: + break; + } + JobFinish = true; + } + } + } + } +} diff --git a/FunGame.Core/Library/Common/Network/ServerSocket.cs b/FunGame.Core/Library/Common/Network/ServerSocket.cs index e66b876..aec70ff 100644 --- a/FunGame.Core/Library/Common/Network/ServerSocket.cs +++ b/FunGame.Core/Library/Common/Network/ServerSocket.cs @@ -20,16 +20,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Network public int UsersCount => OnlineUsers.Count; public int BannedCount => BannedList.Count; - private readonly ThreadManager OnlineUsers; + private readonly ModelManager OnlineUsers; private ServerSocket(System.Net.Sockets.Socket Instance, int ServerPort, int MaxConnection = 0) { this.Instance = Instance; this.ServerPort = ServerPort; if (MaxConnection <= 0) - OnlineUsers = new ThreadManager(); + OnlineUsers = new ModelManager(); else - OnlineUsers = new ThreadManager(MaxConnection); + OnlineUsers = new ModelManager(MaxConnection); } public static ServerSocket StartListening(int Port = 22222, int MaxConnection = 0) diff --git a/FunGame.Core/Library/Common/Network/SocketObject.cs b/FunGame.Core/Library/Common/Network/SocketObject.cs index a22d9bb..ddc6a11 100644 --- a/FunGame.Core/Library/Common/Network/SocketObject.cs +++ b/FunGame.Core/Library/Common/Network/SocketObject.cs @@ -2,6 +2,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Network { + [Serializable] public readonly struct SocketObject { public SocketMessageType SocketType { get; } = SocketMessageType.Unknown; diff --git a/FunGame.Core/Library/Constant/General.cs b/FunGame.Core/Library/Constant/General.cs index 01478ce..25a2931 100644 --- a/FunGame.Core/Library/Constant/General.cs +++ b/FunGame.Core/Library/Constant/General.cs @@ -12,7 +12,7 @@ namespace Milimoe.FunGame.Core.Library.Constant // Const public const int MaxRetryTimes = 20; public const int MaxTask_1C2G = 10; - public const int MaxThread_General = 20; + public const int MaxTask_2C2G = 20; public const int MaxTask_4C4G = 40; public const int SocketByteSize = 512 * 1024; diff --git a/FunGame.Core/Library/Constant/ResultEnum.cs b/FunGame.Core/Library/Constant/ResultEnum.cs index 8f70119..ac57cce 100644 --- a/FunGame.Core/Library/Constant/ResultEnum.cs +++ b/FunGame.Core/Library/Constant/ResultEnum.cs @@ -23,6 +23,13 @@ NotSent, NotReceived } + + public enum RequestResult + { + Success, + Fail, + Missing + } public enum ConnectResult { diff --git a/FunGame.Core/Library/Constant/TypeEnum.cs b/FunGame.Core/Library/Constant/TypeEnum.cs index 3f3534e..8d1654d 100644 --- a/FunGame.Core/Library/Constant/TypeEnum.cs +++ b/FunGame.Core/Library/Constant/TypeEnum.cs @@ -50,6 +50,7 @@ public enum SocketMessageType { Unknown, + DataRequest, Connect, GetNotice, Login, @@ -67,6 +68,11 @@ ChangeRoomSetting } + public enum DataRequestType + { + + } + public enum SocketRuntimeType { Client, diff --git a/FunGame.Core/Library/Server/BaseServerModel.cs b/FunGame.Core/Library/Server/BaseModel.cs similarity index 100% rename from FunGame.Core/Library/Server/BaseServerModel.cs rename to FunGame.Core/Library/Server/BaseModel.cs diff --git a/FunGame.Core/Service/ModelManager.cs b/FunGame.Core/Service/ModelManager.cs new file mode 100644 index 0000000..447116a --- /dev/null +++ b/FunGame.Core/Service/ModelManager.cs @@ -0,0 +1,110 @@ +using System.Collections.Concurrent; +using Milimoe.FunGame.Core.Library.Server; + +namespace Milimoe.FunGame.Core.Service +{ + internal class ModelManager + { + /// + /// 目前的Model数量 + /// + internal int Count => Models.Count; + + /// + /// 最大接受的Model数量 + /// + private int MaxModel { get; } + + /// + /// 可参与高并发的字典,但添加效率较低 + /// + private ConcurrentDictionary Models { get; } = new(); + + /// + /// Init ModelManager + /// + /// MaxModel + internal ModelManager(int MaxModel = 0) + { + if (MaxModel <= 0) + this.MaxModel = Library.Constant.General.MaxTask_2C2G; + else + { + this.MaxModel = MaxModel; + } + } + + /// + /// 获取Model对象 + /// + /// Model的Key + /// Model对象 + internal BaseModel this[string name] => Models[name]; + + /// + /// 向Model管理器中添加Model + /// + /// Model的Key + /// Model对象 + /// True:操作成功 + internal bool Add(string name, BaseModel t) + { + if (Models.Count + 1 > MaxModel) return false; + return Models.TryAdd(name, t); + } + + /// + /// 从Model管理器中移除Model + /// + /// Model的Key + /// True:操作成功 + internal bool Remove(string name) + { + return Models.TryRemove(name, out _); + } + + /// + /// 将Model移除,并取得这个Model + /// + /// Model的Key + /// Model对象 + /// 被移除的Model + internal bool Remove(string name, ref BaseModel? t) + { + return Models.TryRemove(name, out t); + } + + /// + /// 将Model移除,并取得这个Model + /// + /// Model的Key + /// 被移除的Model + internal BaseModel? RemoveAndGet(string name) + { + Models.TryRemove(name, out BaseModel? result); + return result; + } + + internal bool ContainsKey(string name) + { + return Models.ContainsKey(name); + } + + /// + /// 清空Model管理器 + /// + internal void Clear() + { + Models.Clear(); + } + + + /// + /// 获取Model对象的列表 + /// + internal List GetList() + { + return Models.Values.ToList(); + } + } +} diff --git a/FunGame.Core/Service/ThreadManager.cs b/FunGame.Core/Service/ThreadManager.cs deleted file mode 100644 index 900e093..0000000 --- a/FunGame.Core/Service/ThreadManager.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System.Collections.Concurrent; -using Milimoe.FunGame.Core.Library.Server; - -namespace Milimoe.FunGame.Core.Service -{ - internal class ThreadManager - { - /// - /// 目前的线程数量 - /// - internal int Count => Threads.Count; - - /// - /// 最大接受的线程数量 - /// - private int MaxThread { get; } - - /// - /// 可参与高并发的字典,但添加效率较低 - /// - private ConcurrentDictionary Threads { get; } = new(); - - /// - /// Init ThreadManager - /// - /// MaxThread - internal ThreadManager(int MaxThread = 0) - { - if (MaxThread <= 0) - this.MaxThread = Library.Constant.General.MaxThread_General; - else - { - this.MaxThread = MaxThread; - } - } - - /// - /// 获取Thread对象 - /// - /// Thread的Key - /// Thread对象 - internal BaseModel this[string name] => Threads[name]; - - /// - /// 向线程管理器中添加Thread - /// - /// Thread的Key - /// Thread对象 - /// True:操作成功 - internal bool Add(string name, BaseModel t) - { - if (Threads.Count + 1 > MaxThread) return false; - return Threads.TryAdd(name, t); - } - - /// - /// 从线程管理器中移除Thread - /// - /// Thread的Key - /// True:操作成功 - internal bool Remove(string name) - { - return Threads.TryRemove(name, out _); - } - - /// - /// 将Thread移除,并取得这个Thread - /// - /// Thread的Key - /// Thread对象 - /// 被移除的Thread - internal bool Remove(string name, ref BaseModel? t) - { - return Threads.TryRemove(name, out t); - } - - /// - /// 将Thread移除,并取得这个Thread - /// - /// Thread的Key - /// 被移除的Thread - internal BaseModel? RemoveAndGet(string name) - { - Threads.TryRemove(name, out BaseModel? result); - return result; - } - - internal bool ContainsKey(string name) - { - return Threads.ContainsKey(name); - } - - /// - /// 清空线程管理器 - /// - internal void Clear() - { - Threads.Clear(); - } - - - /// - /// 获取线程对象的列表 - /// - internal List GetList() - { - return Threads.Values.ToList(); - } - } -}