From 4498a6fbf85c838c8d1691a2964056f297d1dcde Mon Sep 17 00:00:00 2001 From: yeziuku <53083103+yeziuku@users.noreply.github.com> Date: Sun, 5 Apr 2026 22:47:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8A=A0=E8=BD=BD=E9=A1=B9Da?= =?UTF-8?q?taRequest=E6=8E=A7=E5=88=B6=E5=88=86=E6=94=AF=EF=BC=9B=E5=8F=98?= =?UTF-8?q?=E9=87=8F=E5=90=8D=E4=BC=98=E5=8C=96=20(#56)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 新增加载项DataRequest控制分支;变量名优化 * 线程安全优化 --------- Co-authored-by: milimoe --- .../Controllers/DataRequestController.cs | 188 ++++++++++++------ FunGame.Server/Main.cs | 12 +- FunGame.Server/Models/ServerModel.cs | 4 +- FunGame.Server/Others/Config.cs | 32 ++- FunGame.WebAPI/Controllers/UserController.cs | 8 +- FunGame.WebAPI/Program.cs | 10 +- 6 files changed, 175 insertions(+), 79 deletions(-) diff --git a/FunGame.Server/Controllers/DataRequestController.cs b/FunGame.Server/Controllers/DataRequestController.cs index 533d75a..6e52621 100644 --- a/FunGame.Server/Controllers/DataRequestController.cs +++ b/FunGame.Server/Controllers/DataRequestController.cs @@ -21,9 +21,9 @@ namespace Milimoe.FunGame.Server.Controller /// public class DataRequestController where T : ISocketMessageProcessor { - public ServerModel Server { get; } - public SQLHelper? SQLHelper => Server.SQLHelper; - public MailSender? MailSender => Server.MailSender; + public ServerModel Client { get; } + public SQLHelper? SQLHelper => Client.SQLHelper; + public MailSender? MailSender => Client.MailSender; public Authenticator? Authenticator { get; } public DataRequestType LastRequest => _lastRequest; @@ -35,11 +35,11 @@ namespace Milimoe.FunGame.Server.Controller /// /// 数据请求控制器 /// - /// - public DataRequestController(ServerModel server) + /// + public DataRequestController(ServerModel client) { - Server = server; - if (SQLHelper != null) Authenticator = new(Server, SQLHelper, MailSender); + Client = client; + if (SQLHelper != null) Authenticator = new(Client, SQLHelper, MailSender); } /// @@ -52,7 +52,7 @@ namespace Milimoe.FunGame.Server.Controller { Dictionary result = []; _lastRequest = type; - ServerHelper.WriteLine(Server.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); + ServerHelper.WriteLine(Client.GetClientName() + " -> " + DataRequestSet.GetTypeString(_lastRequest), InvokeMessageType.DataRequest); switch (type) { @@ -199,6 +199,14 @@ namespace Milimoe.FunGame.Server.Controller RespondOffer(data, result); break; + case DataRequestType.Addon_Plugin: + result = HandleDataRequest_ServerPlugin(data); + break; + + case DataRequestType.Addon_Module: + result = HandleDataRequest_GameModuleServer(data); + break; + default: break; } @@ -230,11 +238,11 @@ namespace Milimoe.FunGame.Server.Controller msg = DataRequestService.GetPluginCancelString(DataRequestType.RunTime_Logout, eventArgs); ServerHelper.WriteLine(msg, InvokeMessageType.DataRequest, LogLevel.Warning); } - else if (Server.IsLoginKey(key)) + else if (Client.IsLoginKey(key)) { // 从玩家列表移除 - Server.RemoveUser(); - Server.GetUsersCount(); + Client.RemoveUser(); + Client.GetUsersCount(); msg = "你已成功退出登录! "; } else eventArgs.Success = false; @@ -367,7 +375,7 @@ namespace Milimoe.FunGame.Server.Controller } else { - result = await Server.QuitRoom(roomid, isMaster); + result = await Client.QuitRoom(roomid, isMaster); } eventArgs.Success = result; @@ -406,11 +414,11 @@ namespace Milimoe.FunGame.Server.Controller SQLHelper.ExecuteDataSet(RoomQuery.Select_RoomByRoomId(SQLHelper, roomid)); if (SQLHelper.Success) { - FunGameSystem.RoomList.IntoRoom(roomid, Server.User); - Server.InRoom = room; - Server.User.OnlineState = OnlineState.InRoom; - await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && roomid == c.InRoom.Roomid && c.User.Id != 0), - SocketMessageType.Chat, Server.User.Username, DateTimeUtility.GetNowShortTime() + " [ " + Server.User.Username + " ] 进入了房间。"); + FunGameSystem.RoomList.IntoRoom(roomid, Client.User); + Client.InRoom = room; + Client.User.OnlineState = OnlineState.InRoom; + await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && roomid == c.InRoom.Roomid && c.User.Id != 0), + SocketMessageType.Chat, Client.User.Username, DateTimeUtility.GetNowShortTime() + " [ " + Client.User.Username + " ] 进入了房间。"); result = true; } else @@ -482,7 +490,7 @@ namespace Milimoe.FunGame.Server.Controller if (requestData.Count >= 1) { roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; - User user = Server.User; + User user = Client.User; if (roomid != "-1" && user.Id != 0 && user.Id != FunGameSystem.RoomList.GetRoomMaster(roomid).Id && !FunGameSystem.RoomList.GetReadyUserList(roomid).Contains(user)) { @@ -507,7 +515,7 @@ namespace Milimoe.FunGame.Server.Controller if (requestData.Count >= 1) { roomid = DataRequest.GetDictionaryJsonObject(requestData, "roomid") ?? "-1"; - User user = Server.User; + User user = Client.User; if (roomid != "-1" && user.Id != 0 && user.Id != FunGameSystem.RoomList.GetRoomMaster(roomid).Id && FunGameSystem.RoomList.GetReadyUserList(roomid).Contains(user)) { @@ -540,8 +548,8 @@ namespace Milimoe.FunGame.Server.Controller } else if (msg.Trim() != "") { - await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && Server.InRoom.Roomid == c.InRoom.Roomid && c.User.Id != 0), - SocketMessageType.Chat, Server.User.Username, msg); + await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && Client.InRoom.Roomid == c.InRoom.Roomid && c.User.Id != 0), + SocketMessageType.Chat, Client.User.Username, msg); } eventArgs.Success = !eventArgs.Cancel; @@ -583,8 +591,8 @@ namespace Milimoe.FunGame.Server.Controller if (_isReadyCheckCD[0] == false) { // 提醒玩家准备 - Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Server.User.Username); - Server.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames); + Client.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。", "", 0, Client.User.Username); + Client.SendSystemMessage(ShowMessageType.Tip, "房主即将开始游戏,请准备!", "请准备就绪", 10, usernames); _isReadyCheckCD[0] = true; TaskUtility.RunTimer(() => { @@ -593,7 +601,7 @@ namespace Milimoe.FunGame.Server.Controller } else { - Server.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Server.User.Username); + Client.SendSystemMessage(ShowMessageType.None, "还有玩家尚未准备,无法开始游戏。15秒内只能发送一次准备提醒。", "", 0, Client.User.Username); } } else @@ -601,12 +609,12 @@ namespace Milimoe.FunGame.Server.Controller List users = FunGameSystem.RoomList.GetUsers(roomid); if (users.Count < 2) { - Server.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Server.User.Username); + Client.SendSystemMessage(ShowMessageType.None, "玩家数量不足,无法开始游戏。", "", 0, Client.User.Username); } else { usernames = [.. users.Select(user => user.Username)]; - Server.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备,游戏将在10秒后开始。", "", 0, usernames); + Client.SendSystemMessage(ShowMessageType.None, "所有玩家均已准备,游戏将在10秒后开始。", "", 0, usernames); StartGame(roomid, users, usernames); result = true; } @@ -615,8 +623,8 @@ namespace Milimoe.FunGame.Server.Controller else if (_isReadyCheckCD[1] == false) { // 提醒房主开始游戏 - Server.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Server.User.Username); - Server.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, FunGameSystem.RoomList[roomid].RoomMaster.Username); + Client.SendSystemMessage(ShowMessageType.None, "已提醒房主立即开始游戏。", "", 0, Client.User.Username); + Client.SendSystemMessage(ShowMessageType.Tip, "房间中的玩家已请求你立即开始游戏。", "请求开始", 10, FunGameSystem.RoomList[roomid].RoomMaster.Username); _isReadyCheckCD[1] = true; TaskUtility.RunTimer(() => { @@ -625,7 +633,7 @@ namespace Milimoe.FunGame.Server.Controller } else { - Server.SendSystemMessage(ShowMessageType.None, "15秒内只能发送一次提醒,请稍后再试。", "", 0, Server.User.Username); + Client.SendSystemMessage(ShowMessageType.None, "15秒内只能发送一次提醒,请稍后再试。", "", 0, Client.User.Username); } } @@ -651,20 +659,20 @@ namespace Milimoe.FunGame.Server.Controller if (FunGameSystem.GameModuleLoader != null && FunGameSystem.GameModuleLoader.ModuleServers.ContainsKey(room.GameModule)) { room.RoomState = RoomState.Gaming; - Server.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule); - Server.User.OnlineState = OnlineState.Gaming; - Dictionary all = Server.Listener.UserList.Cast().ToDictionary(k => k.User.Username, v => v); + Client.NowGamingServer = FunGameSystem.GameModuleLoader.GetServerMode(room.GameModule); + Client.User.OnlineState = OnlineState.Gaming; + Dictionary all = Client.Listener.UserList.Cast().ToDictionary(k => k.User.Username, v => v); // 给其他玩家赋值模组服务器 - foreach (IServerModel model in all.Values.Where(s => s.User.Username != Server.User.Username)) + foreach (IServerModel model in all.Values.Where(s => s.User.Username != Client.User.Username)) { - model.NowGamingServer = Server.NowGamingServer; + model.NowGamingServer = Client.NowGamingServer; model.User.OnlineState = OnlineState.Gaming; } - GamingObject obj = new(room, users, Server, all); - if (Server.NowGamingServer.StartServer(obj)) + GamingObject obj = new(room, users, Client, all); + if (Client.NowGamingServer.StartServer(obj)) { - Server.NowGamingServer.GamingObjects.TryAdd(room.Roomid, obj); - foreach (IServerModel serverTask in Server.Listener.UserList.Where(model => usernames.Contains(model.User.Username))) + Client.NowGamingServer.GamingObjects.TryAdd(room.Roomid, obj); + foreach (IServerModel serverTask in Client.Listener.UserList.Where(model => usernames.Contains(model.User.Username))) { if (serverTask != null && serverTask.Socket != null) { @@ -697,7 +705,7 @@ namespace Milimoe.FunGame.Server.Controller string password = DataRequest.GetDictionaryJsonObject(requestData, "password") ?? ""; string email = DataRequest.GetDictionaryJsonObject(requestData, "email") ?? ""; string verifycode = DataRequest.GetDictionaryJsonObject(requestData, "verifycode") ?? ""; - (msg, returnType, success) = DataRequestService.Reg(Server, username, password, email, verifycode, Server.Socket?.ClientIP ?? ""); + (msg, returnType, success) = DataRequestService.Reg(Client, username, password, email, verifycode, Client.Socket?.ClientIP ?? ""); } else { @@ -741,10 +749,10 @@ namespace Milimoe.FunGame.Server.Controller // CheckLogin的情况 if (key != Guid.Empty) { - if (Server.IsLoginKey(key)) + if (Client.IsLoginKey(key)) { - await Server.CheckLogin(); - user = Server.User; + await Client.CheckLogin(); + user = Client.User; } else { @@ -758,7 +766,7 @@ namespace Milimoe.FunGame.Server.Controller (bool success, DataSet dsUser, msg, key) = DataRequestService.PreLogin(this, username, password, autokey); if (success) { - Server.PreLogin(dsUser, key); + Client.PreLogin(dsUser, key); resultData.Add("key", key); } } @@ -797,7 +805,7 @@ namespace Milimoe.FunGame.Server.Controller } if ((DateTime.Now - SendTime).TotalMinutes >= 10) { - ServerHelper.WriteLine(Server.GetClientName() + " 验证码已过期"); + ServerHelper.WriteLine(Client.GetClientName() + " 验证码已过期"); msg = "此验证码已过期,请重新找回密码。"; SQLHelper.Execute(ForgetVerifyCodes.Delete_ForgetVerifyCode(SQLHelper, username, email)); } @@ -847,18 +855,18 @@ namespace Milimoe.FunGame.Server.Controller string[] To = [email]; if (MailSender.Send(MailSender.CreateMail(Subject, Body, System.Net.Mail.MailPriority.Normal, true, To)) == MailSendResult.Success) { - ServerHelper.WriteLine(Server.GetClientName() + $" 已向{email}发送验证码:{forgetVerify}"); + ServerHelper.WriteLine(Client.GetClientName() + $" 已向{email}发送验证码:{forgetVerify}"); msg = ""; } else { - ServerHelper.WriteLine(Server.GetClientName() + " 无法发送验证码"); + ServerHelper.WriteLine(Client.GetClientName() + " 无法发送验证码"); ServerHelper.WriteLine(MailSender.ErrorMsg); } } else // 不使用MailSender的情况 { - ServerHelper.WriteLine(Server.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户"); + ServerHelper.WriteLine(Client.GetClientName() + $" 验证码为:{forgetVerify},但因 SMTP 服务未开启,请服务器管理员告知此用户"); msg = ""; } } @@ -867,7 +875,7 @@ namespace Milimoe.FunGame.Server.Controller { // 发送过验证码且验证码没有过期 string ForgetVerifyCode = (string)dr[ForgetVerifyCodes.Column_ForgetVerifyCode]; - ServerHelper.WriteLine(Server.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}"); + ServerHelper.WriteLine(Client.GetClientName() + $" 十分钟内已向{email}发送过验证码:{ForgetVerifyCode}"); msg = ""; } } @@ -896,7 +904,7 @@ namespace Milimoe.FunGame.Server.Controller int newMaxUsers = DataRequest.GetDictionaryJsonObject(requestData, "maxUsers"); string newModule = DataRequest.GetDictionaryJsonObject(requestData, "module") ?? ""; string newMap = DataRequest.GetDictionaryJsonObject(requestData, "map") ?? ""; - User user = Server.User; + User user = Client.User; if (roomid != "-1" && FunGameSystem.RoomList.Exists(roomid)) { Room room = FunGameSystem.RoomList[roomid]; @@ -995,7 +1003,7 @@ namespace Milimoe.FunGame.Server.Controller SQLHelper.UpdateRoomMaster(roomid, newMaster.Id); if (SQLHelper.Result == SQLResult.Success) { - await Server.SendClients(Server.Listener.ClientList.Where(c => c != null && c.InRoom.Roomid == roomid), SocketMessageType.UpdateRoomMaster, room); + await Client.SendClients(Client.Listener.ClientList.Where(c => c != null && c.InRoom.Roomid == roomid), SocketMessageType.UpdateRoomMaster, room); ServerHelper.WriteLine($"[UpdateRoomMaster] RoomID: {roomid} 房主变更: {oldMaster.Username} -> {newMaster.Username}"); } } @@ -1024,15 +1032,15 @@ namespace Milimoe.FunGame.Server.Controller { _isMatching = true; if (user.OnlineState == OnlineState.Online) user.OnlineState = OnlineState.Matching; - ServerHelper.WriteLine(Server.GetClientName() + " 开始匹配。类型:" + RoomSet.GetTypeString(type)); + ServerHelper.WriteLine(Client.GetClientName() + " 开始匹配。类型:" + RoomSet.GetTypeString(type)); TaskUtility.NewTask(async () => { if (_isMatching) { Room room = await MatchingRoom(type, user); - if (_isMatching && Server.Socket != null) + if (_isMatching && Client.Socket != null) { - await Server.Send(SocketMessageType.MatchRoom, room); + await Client.Send(SocketMessageType.MatchRoom, room); } _isMatching = false; } @@ -1050,8 +1058,8 @@ namespace Milimoe.FunGame.Server.Controller { if (_isMatching) { - ServerHelper.WriteLine(Server.GetClientName() + " 取消了匹配。"); - if (Server.User.OnlineState == OnlineState.Matching) Server.User.OnlineState = OnlineState.Online; + ServerHelper.WriteLine(Client.GetClientName() + " 取消了匹配。"); + if (Client.User.OnlineState == OnlineState.Matching) Client.User.OnlineState = OnlineState.Online; _isMatching = false; } } @@ -1239,7 +1247,7 @@ namespace Milimoe.FunGame.Server.Controller } else if (SQLHelper != null) { - long userId = Server.User.Id; + long userId = Client.User.Id; if (userId != 0) { DataRow? dr = SQLHelper.ExecuteDataRow(UserSignIns.Select_GetUserSignIn(SQLHelper, userId)); @@ -1808,8 +1816,8 @@ namespace Milimoe.FunGame.Server.Controller if (offer != null) { // 检查当前用户是否有权限查看(报价创建者或接收者)允许管理员使用 API 查询报价 - long userId = Server.User.Id; - if ((apiQuery && Server.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId) + long userId = Client.User.Id; + if ((apiQuery && Client.User.IsAdmin) || offer.Offeror == userId || offer.Offeree == userId) { resultData.Add("offer", offer); msg = ""; @@ -1838,7 +1846,7 @@ namespace Milimoe.FunGame.Server.Controller if (SQLHelper != null && requestData.Count >= 1) { long offeree = DataRequest.GetDictionaryJsonObject(requestData, "offeree"); - long offeror = Server.User.Id; + long offeror = Client.User.Id; if (offeror != 0 && offeree != 0 && offeror != offeree) { SQLHelper.AddOffer(offeror, offeree); @@ -1875,7 +1883,7 @@ namespace Milimoe.FunGame.Server.Controller OfferActionType action = DataRequest.GetDictionaryJsonObject(requestData, "action"); List offerorItems = DataRequest.GetDictionaryJsonObject>(requestData, "offerorItems") ?? []; List offereeItems = DataRequest.GetDictionaryJsonObject>(requestData, "offereeItems") ?? []; - long userId = Server.User.Id; + long userId = Client.User.Id; Offer? offer = SQLHelper.GetOffer(offerId); if (offer != null && (offer.Offeror == userId || offer.Offeree == userId)) @@ -2063,7 +2071,7 @@ namespace Milimoe.FunGame.Server.Controller { long offerId = DataRequest.GetDictionaryJsonObject(requestData, "id"); OfferActionType action = DataRequest.GetDictionaryJsonObject(requestData, "action"); - long userId = Server.User.Id; + long userId = Client.User.Id; Offer? offer = SQLHelper.GetOffer(offerId); if (offer != null && offer.Offeree == userId) @@ -2181,5 +2189,63 @@ namespace Milimoe.FunGame.Server.Controller } #endregion + + #region Addon + + private Dictionary HandleDataRequest_ServerPlugin(Dictionary requestData) + { + Dictionary result = []; + string fromPlugin = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_FromPlugin) ?? ""; + string targetPlugin = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_TargetPlugin) ?? ""; + AddonDataRequestEventArgs args = new(Client, fromPlugin, targetPlugin); + if (targetPlugin.Trim() != "") + { + if (FunGameSystem.ServerPluginLoader?.Plugins.TryGetValue(targetPlugin, out ServerPlugin? server) ?? false && server != null) + { + Dictionary dataServerPlugin = server.HandleDataRequest(requestData, args); + foreach (string key in dataServerPlugin.Keys) + { + result[key] = dataServerPlugin[key]; + } + } + if (FunGameSystem.WebAPIPluginLoader?.Plugins.TryGetValue(targetPlugin, out WebAPIPlugin? webapi) ?? false && webapi != null) + { + Dictionary dataServerPlugin = webapi.HandleDataRequest(requestData, args); + foreach (string key in dataServerPlugin.Keys) + { + result[key] = dataServerPlugin[key]; + } + } + return result; + } + Dictionary dataServerPlugins = FunGameSystem.ServerPluginLoader?.HandleDataRequest(requestData, args) ?? []; + Dictionary dataWebAPIPlugins = FunGameSystem.WebAPIPluginLoader?.HandleDataRequest(requestData, args) ?? []; + foreach (string key in dataServerPlugins.Keys) + { + result[key] = dataServerPlugins[key]; + } + foreach (string key in dataWebAPIPlugins.Keys) + { + result[key] = dataWebAPIPlugins[key]; + } + return result; + } + + private Dictionary HandleDataRequest_GameModuleServer(Dictionary requestData) + { + string fromModule = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_FromModule) ?? ""; + string targetModule = DataRequest.GetDictionaryJsonObject(requestData, SocketSet.AddonDataRequestMark_TargetModule) ?? ""; + AddonDataRequestEventArgs args = new(Client, fromModule, targetModule); + if (targetModule.Trim() != "") + { + if (FunGameSystem.GameModuleLoader?.ModuleServers.TryGetValue(targetModule, out GameModuleServer? server) ?? false && server != null) + { + return server.HandleDataRequest(requestData, args); + } + } + return FunGameSystem.GameModuleLoader?.HandleDataRequest(requestData, args) ?? []; + } + + #endregion } } diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs index f106fd0..0f341cb 100644 --- a/FunGame.Server/Main.cs +++ b/FunGame.Server/Main.cs @@ -164,7 +164,7 @@ void StartServerListening() TaskUtility.NewTask(async () => { clientip = socket.ClientIP; - Config.ConnectingPlayerCount++; + Config.IncrementConnectingPlayerCount(); bool isConnected = false; bool isDebugMode = false; @@ -175,6 +175,7 @@ void StartServerListening() SocketObject[] objs = socket.Receive(); (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs); eventArgs.Success = isConnected; + Config.DecrementConnectingPlayerCount(); if (isConnected) { eventArgs.ConnectResult = ConnectResult.Success; @@ -191,13 +192,12 @@ void StartServerListening() FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs); ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core); } - Config.ConnectingPlayerCount--; }).OnError(e => { + Config.DecrementConnectingPlayerCount(); ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect); FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs); - if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0; ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core); ServerHelper.Error(e); }); @@ -241,7 +241,7 @@ void StartServerListening() TaskUtility.NewTask(async () => { clientip = socket.ClientIP; - Config.ConnectingPlayerCount++; + Config.IncrementConnectingPlayerCount(); bool isConnected = false; bool isDebugMode = false; @@ -256,6 +256,7 @@ void StartServerListening() } (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect)); eventArgs.Success = isConnected; + Config.DecrementConnectingPlayerCount(); if (isConnected) { eventArgs.ConnectResult = ConnectResult.Success; @@ -273,13 +274,12 @@ void StartServerListening() ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core); await socket.CloseAsync(); } - Config.ConnectingPlayerCount--; }).OnError(e => { + Config.DecrementConnectingPlayerCount(); ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect); FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(socket, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(socket, eventArgs); - if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0; ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core); ServerHelper.Error(e); }); diff --git a/FunGame.Server/Models/ServerModel.cs b/FunGame.Server/Models/ServerModel.cs index 59db27e..6239365 100644 --- a/FunGame.Server/Models/ServerModel.cs +++ b/FunGame.Server/Models/ServerModel.cs @@ -48,9 +48,9 @@ namespace Milimoe.FunGame.Server.Model protected DataSet _dsUser = new(); protected Guid _checkLoginKey = Guid.Empty; - public ServerModel(ISocketListener server, ISocketMessageProcessor socket, bool isDebugMode) + public ServerModel(ISocketListener listener, ISocketMessageProcessor socket, bool isDebugMode) { - Listener = server; + Listener = listener; Socket = socket; DataRequestController = new(this); IsDebugMode = isDebugMode; diff --git a/FunGame.Server/Others/Config.cs b/FunGame.Server/Others/Config.cs index f6ce468..5e28820 100644 --- a/FunGame.Server/Others/Config.cs +++ b/FunGame.Server/Others/Config.cs @@ -137,7 +137,7 @@ namespace Milimoe.FunGame.Server.Others /// /// 正在连接的玩家数量 /// - public static int ConnectingPlayerCount { get; set; } = 0; + public static int ConnectingPlayerCount => Math.Max(0, _connectingPlayerCount); /// /// 默认传输字符集 @@ -158,6 +158,36 @@ namespace Milimoe.FunGame.Server.Others /// 未Loadmodules时,此属性表示至少需要安装的模组 /// public static string[] GameModuleSupported { get; set; } = []; + + /// + /// 正在连接的玩家数量 + /// + private static int _connectingPlayerCount = 0; + + /// + /// 线程安全的递增正在连接的玩家数量 + /// + /// + public static int IncrementConnectingPlayerCount() + { + return Interlocked.Increment(ref _connectingPlayerCount); + } + + /// + /// 线程安全的递减正在连接的玩家数量 + /// + /// + public static int DecrementConnectingPlayerCount() + { + int original, newValue; + do + { + original = Volatile.Read(ref _connectingPlayerCount); + newValue = Math.Max(0, original - 1); + } while (Interlocked.CompareExchange(ref _connectingPlayerCount, newValue, original) != original); + + return newValue; + } } /// diff --git a/FunGame.WebAPI/Controllers/UserController.cs b/FunGame.WebAPI/Controllers/UserController.cs index 626688d..da3fd5b 100644 --- a/FunGame.WebAPI/Controllers/UserController.cs +++ b/FunGame.WebAPI/Controllers/UserController.cs @@ -69,7 +69,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers public async Task Login([FromBody] LoginDTO dto) { string msg = "服务器暂时无法处理登录请求。"; - Config.ConnectingPlayerCount++; + Config.IncrementConnectingPlayerCount(); PayloadModel response = new() { Event = "user_login", @@ -94,7 +94,7 @@ namespace Milimoe.FunGame.WebAPI.Controllers // 确认登录 await model.CheckLogin(); string token = jwtTokenService.GenerateToken(username); - Config.ConnectingPlayerCount--; + Config.DecrementConnectingPlayerCount(); response.StatusCode = 200; response.Message = "登录成功!"; response.Data = new() @@ -107,14 +107,14 @@ namespace Milimoe.FunGame.WebAPI.Controllers await model.Send(SocketMessageType.Disconnect); } - Config.ConnectingPlayerCount--; + Config.DecrementConnectingPlayerCount(); response.Message = msg; response.StatusCode = 401; return Unauthorized(response); } catch (Exception e) { - Config.ConnectingPlayerCount--; + Config.DecrementConnectingPlayerCount(); logger.LogError("Error: {e}", e); } diff --git a/FunGame.WebAPI/Program.cs b/FunGame.WebAPI/Program.cs index b3edaa0..434a572 100644 --- a/FunGame.WebAPI/Program.cs +++ b/FunGame.WebAPI/Program.cs @@ -265,7 +265,7 @@ try await app.StopAsync(); }; - Task order = Task.Factory.StartNew(GetConsoleOrder); + Task order = Task.Run(GetConsoleOrder); otherobjs = [app, listener]; FunGameSystem.OnWebAPIStarted(otherobjs); @@ -281,7 +281,7 @@ async Task GetConsoleOrder() { while (true) { - string order = Console.ReadLine() ?? ""; + string order = await Console.In.ReadLineAsync() ?? ""; ServerHelper.Type(); if (order != "") { @@ -320,7 +320,7 @@ async Task WebSocketConnectionHandler(HttpContext context) Guid token = Guid.NewGuid(); ServerWebSocket socket = new(listener, instance, clientip, clientip, token); - Config.ConnectingPlayerCount++; + Config.IncrementConnectingPlayerCount(); try { bool isConnected = false; @@ -337,6 +337,7 @@ async Task WebSocketConnectionHandler(HttpContext context) } (isConnected, isDebugMode) = await ConnectController.Connect(listener, socket, token, clientip, objs.Where(o => o.SocketType == SocketMessageType.Connect)); eventArgs.Success = isConnected; + Config.DecrementConnectingPlayerCount(); if (isConnected) { eventArgs.ConnectResult = ConnectResult.Success; @@ -354,14 +355,13 @@ async Task WebSocketConnectionHandler(HttpContext context) ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 连接失败。", InvokeMessageType.Core); await socket.CloseAsync(); } - Config.ConnectingPlayerCount--; } catch (Exception e) { + Config.DecrementConnectingPlayerCount(); ConnectEventArgs eventArgs = new(clientip, Config.ServerPort, ConnectResult.CanNotConnect); FunGameSystem.ServerPluginLoader?.OnAfterConnectEvent(context, eventArgs); FunGameSystem.WebAPIPluginLoader?.OnAfterConnectEvent(context, eventArgs); - if (--Config.ConnectingPlayerCount < 0) Config.ConnectingPlayerCount = 0; ServerHelper.WriteLine(ServerHelper.MakeClientName(clientip) + " 中断连接!", InvokeMessageType.Core); ServerHelper.Error(e); }