From 53c6eab3e4d3df0045666cd57e9b348b38c23fdf Mon Sep 17 00:00:00 2001 From: Mili Date: Fri, 16 Sep 2022 22:30:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=80=80=E5=87=BA=E7=99=BB?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FunGameServer/Main.cs | 33 +++++++------ .../Models/Config/OrderDictionary.cs | 15 ++++++ FunGameServer/Sockets/ClientSocket.cs | 49 +++++++++++++++---- FunGameServer/Utils/DataHelper.cs | 11 ++++- FunGameServer/Utils/ServerHelper.cs | 9 ++-- 5 files changed, 87 insertions(+), 30 deletions(-) create mode 100644 FunGameServer/Models/Config/OrderDictionary.cs diff --git a/FunGameServer/Main.cs b/FunGameServer/Main.cs index 72815e0..dc12a02 100644 --- a/FunGameServer/Main.cs +++ b/FunGameServer/Main.cs @@ -26,13 +26,13 @@ while (Running) { switch (order) { - case "quit": + case OrderDictionary.Quit: Running = false; break; - case "help": + case OrderDictionary.Help: ServerHelper.WriteLine("Milimoe -> 帮助"); break; - case "restart": + case OrderDictionary.Restart: if (ServerSocket == null) { ServerHelper.WriteLine("重启服务器"); @@ -73,6 +73,8 @@ void StartServer() Console.Title = Config.SERVER_NAME + " - FunGame Server Port: " + Config.SERVER_PORT; } + Config.DefaultDataHelper.Close(); + // 连接MySQL服务器 if (!Config.DefaultDataHelper.Connect()) { @@ -104,20 +106,19 @@ void StartServer() { socket = ServerSocket.Accept(); IPEndPoint? clientIP = (IPEndPoint?)socket.RemoteEndPoint; - if (clientIP != null) - ServerHelper.WriteLine("客户端" + clientIP.ToString() + "连接 . . ."); - else - ServerHelper.WriteLine("未知地点客户端连接 . . ."); + string clientIPaddress = (clientIP != null) ? clientIP.ToString() : "Unknown"; + ServerHelper.WriteLine("客户端" + clientIPaddress + "连接 . . ."); if (Read(socket) && Send(socket)) - Task.Factory.StartNew(() => + { + ClientSocket cs = new ClientSocket(socket, Running); + Task t = Task.Factory.StartNew(() => { - new ClientSocket(socket, Running).Start(); + cs.Start(); }); + cs.Task = t; + } else - if (clientIP != null) - ServerHelper.WriteLine("客户端" + clientIP.ToString() + "连接失败。"); - else - ServerHelper.WriteLine("客户端连接失败。"); + ServerHelper.WriteLine("客户端" + clientIPaddress + "连接失败。"); } catch (Exception e) { @@ -157,9 +158,9 @@ bool Read(Socket socket) if (length > 0) { string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); - string typestring = CommonEnums.GetSocketTypeName(SocketHelper.GetType(msg)); + string typestring = EnumHelper.GetSocketTypeName(SocketHelper.GetType(msg)); msg = SocketHelper.GetMessage(msg); - if (typestring != CommonEnums.SocketType.Unknown.ToString()) + if (typestring != SocketMessageType.Unknown.ToString()) { ServerHelper.WriteLine("[ 客户端(" + typestring + ")] -> " + msg); return true; @@ -177,7 +178,7 @@ bool Send(Socket socket) // 发送消息给客户端 string msg = " >> 已连接至服务器:" + Config.SERVER_NAME + "。\n\n********** 服务器公告 **********\n\n" + Config.SERVER_NOTICE + "\n\n"; byte[] buffer = new byte[2048]; - buffer = Config.DEFAULT_ENCODING.GetBytes(SocketHelper.MakeMessage((int)CommonEnums.SocketType.GetNotice, msg)); + buffer = Config.DEFAULT_ENCODING.GetBytes(SocketHelper.MakeMessage((int)SocketMessageType.GetNotice, msg)); if (socket.Send(buffer) > 0) { ServerHelper.WriteLine("[ 客户端 ] <- " + "已确认连接"); diff --git a/FunGameServer/Models/Config/OrderDictionary.cs b/FunGameServer/Models/Config/OrderDictionary.cs new file mode 100644 index 0000000..ae37cd1 --- /dev/null +++ b/FunGameServer/Models/Config/OrderDictionary.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace FunGameServer.Models.Config +{ + public class OrderDictionary + { + public const string Help = "help"; + public const string Quit = "quit"; + public const string Restart = "restart"; + } +} diff --git a/FunGameServer/Sockets/ClientSocket.cs b/FunGameServer/Sockets/ClientSocket.cs index 97d5f18..08e1b49 100644 --- a/FunGameServer/Sockets/ClientSocket.cs +++ b/FunGameServer/Sockets/ClientSocket.cs @@ -12,6 +12,7 @@ using System.Reflection.Metadata; using FunGame.Core.Api.Model.Entity; using System.Net; using FunGame.Core.Api.Model.Enum; +using MySqlX.XDevAPI.Common; namespace FunGameServer.Sockets { @@ -19,8 +20,9 @@ namespace FunGameServer.Sockets { public bool Running { get; set; } = false; public Socket? Socket { get; set; } = null; + public Task? Task = null; - private User? user = null; + private User? User = null; public ClientSocket(Socket socket, bool running) { @@ -41,22 +43,49 @@ namespace FunGameServer.Sockets { string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); int type = SocketHelper.GetType(msg); - string typestring = CommonEnums.GetSocketTypeName(type); + string typestring = EnumHelper.GetSocketTypeName(type); msg = SocketHelper.GetMessage(msg); - if (type != (int)CommonEnums.SocketType.HeartBeat) ServerHelper.WriteLine("[ 客户端(" + typestring + ")] -> " + msg); + if (type != (int)SocketMessageType.HeartBeat) ServerHelper.WriteLine("[ 客户端(" + typestring + ")] -> " + msg); switch (type) { - case (int)CommonEnums.SocketType.GetNotice: + case (int)SocketMessageType.GetNotice: msg = Config.SERVER_NOTICE; break; - case (int)CommonEnums.SocketType.Login: + case (int)SocketMessageType.Login: break; - case (int)CommonEnums.SocketType.CheckLogin: - msg = ">> 欢迎回来, " + msg + " 。"; + case (int)SocketMessageType.CheckLogin: + // 添加至玩家列表 + if (!Config.OnlinePlayers.ContainsKey(msg)) + { + if (Task != null) + { + User = new User(msg); + Config.OnlinePlayers.AddOrUpdate(User.Userame, Task, (key, value) => value); + ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Userame + " 已添加"); + } + } + else + { + // TODO + ServerHelper.WriteLine("OnlinePlayers: 玩家 " + msg + " 重复登录!"); + } + msg = " >> 欢迎回来, " + msg + " 。"; break; - case (int)CommonEnums.SocketType.Logout: + case (int)SocketMessageType.Logout: + msg = " >> 你已成功退出登录! "; + if (Task != null && User != null) + { + if (Config.OnlinePlayers.TryRemove(User.Userame, out Task)) + { + ServerHelper.WriteLine("OnlinePlayers: 玩家 " + User.Userame + " 已移除"); + Task = null; + User = null; + } + else + ServerHelper.WriteLine("OnlinePlayers: 移除玩家 " + User.Userame + " 失败"); + } break; - case (int)CommonEnums.SocketType.HeartBeat: + case (int)SocketMessageType.HeartBeat: msg = ""; break; } @@ -78,7 +107,7 @@ namespace FunGameServer.Sockets { byte[] buffer = new byte[2048]; buffer = Config.DEFAULT_ENCODING.GetBytes(Convert.ToString(SocketHelper.MakeMessage(type, msg))); - string typestring = CommonEnums.GetSocketTypeName(type); + string typestring = EnumHelper.GetSocketTypeName(type); if (socket.Send(buffer) > 0) { if (msg != "") diff --git a/FunGameServer/Utils/DataHelper.cs b/FunGameServer/Utils/DataHelper.cs index e368179..b0ad685 100644 --- a/FunGameServer/Utils/DataHelper.cs +++ b/FunGameServer/Utils/DataHelper.cs @@ -1,4 +1,5 @@ using FunGame.Core.Api.Model.Entity; +using FunGame.Core.Api.Model.Enum; using FunGameServer.Models.Config; using MySql.Data.MySqlClient; using System; @@ -6,7 +7,6 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using static FunGame.Core.Api.Model.Enum.CommonEnums; namespace FunGameServer.Utils { @@ -51,5 +51,14 @@ namespace FunGameServer.Utils } return false; } + + public void Close() + { + if (msc != null && msc.State == System.Data.ConnectionState.Open) + { + msc.Close(); + } + msc = null; + } } } diff --git a/FunGameServer/Utils/ServerHelper.cs b/FunGameServer/Utils/ServerHelper.cs index 4597dfa..9d20235 100644 --- a/FunGameServer/Utils/ServerHelper.cs +++ b/FunGameServer/Utils/ServerHelper.cs @@ -1,4 +1,5 @@ -using FunGameServer.Models.Config; +using FunGame.Core.Api.Model.Enum; +using FunGameServer.Models.Config; using System; using System.Collections; using System.Collections.Generic; @@ -6,7 +7,6 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; -using static FunGame.Core.Api.Model.Enum.CommonEnums; namespace FunGameServer.Utils { @@ -68,7 +68,10 @@ namespace FunGameServer.Utils public static void InitOrderList() { - Config.OrderList.Add("Help", "Milimoe -> 帮助"); + Config.OrderList.Clear(); + Config.OrderList.Add(OrderDictionary.Help, "Milimoe -> 帮助"); + Config.OrderList.Add(OrderDictionary.Quit, "Milimoe -> 帮助"); + Config.OrderList.Add(OrderDictionary.Restart, "Milimoe -> 帮助"); } public static bool IsIP(string ip)