diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs index dbd29a0..9986b4b 100644 --- a/FunGame.Server/Main.cs +++ b/FunGame.Server/Main.cs @@ -151,7 +151,7 @@ bool Read(ClientSocket socket) byte[] buffer = new byte[2048]; object[] read = socket.Receive(); SocketMessageType type = (SocketMessageType)read[0]; - object[] objs = (object[])read[1]; + object[] objs = (object[])read[2]; if (type != SocketMessageType.Unknown) { if (objs[0] != null && objs[0].GetType() == typeof(string) && objs[0].ToString()!.Trim() != "") @@ -170,7 +170,7 @@ bool Send(ClientSocket socket) string msg = Config.SERVER_NAME + ";" + Config.SERVER_NOTICE; byte[] buffer = new byte[2048]; buffer = Config.DEFAULT_ENCODING.GetBytes($"1;{msg}"); - if (socket.Send(SocketMessageType.Connect, msg, Guid.NewGuid().ToString()) == SocketResult.Success) + if (socket.Send(SocketMessageType.Connect, msg, Guid.NewGuid()) == SocketResult.Success) { ServerHelper.WriteLine(SocketHelper.MakeClientName(socket.ClientIP) + " <- " + "已确认连接"); return true; @@ -182,9 +182,6 @@ bool Send(ClientSocket socket) SQLResult TestSQLConnection() { - SQLResult TestResult = SQLResult.Success; - MySQLHelper SQLHelper = MySQLHelper.GetHelper(); - SQLHelper.Script = SQLConstant.Insert_ServerLoginLogs(Config.SERVER_NAME, Config.SERVER_KEY); - SQLHelper.Execute(out TestResult); + new MySQLHelper(true, SQLConstant.Insert_ServerLoginLogs(Config.SERVER_NAME, Config.SERVER_KEY)).Execute(out SQLResult TestResult); return TestResult; } \ No newline at end of file diff --git a/FunGame.Server/Model/ServerModel.cs b/FunGame.Server/Model/ServerModel.cs index e2dd2d4..44d49dd 100644 --- a/FunGame.Server/Model/ServerModel.cs +++ b/FunGame.Server/Model/ServerModel.cs @@ -2,6 +2,7 @@ using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Library.Exception; using Milimoe.FunGame.Core.Library.Server; using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Utility; @@ -27,12 +28,13 @@ namespace Milimoe.FunGame.Server.Model private string UserName = ""; private string Password = ""; private int FailedTimes = 0; // 超过一定次数断开连接 - private MySQLHelper SQLHelper = MySQLHelper.GetHelper(); + private readonly MySQLHelper SQLHelper; public ServerModel(ClientSocket socket, bool running) { Socket = socket; Running = running; + SQLHelper = new(SocketHelper.MakeClientName(socket.ClientIP)); } public override bool Read(ClientSocket socket) @@ -42,7 +44,8 @@ namespace Milimoe.FunGame.Server.Model { object[] objs = socket.Receive(); SocketMessageType type = (SocketMessageType)objs[0]; - object[] args = (object[])objs[1]; + Guid token = (Guid)objs[1]; + object[] args = (object[])objs[2]; string msg = ""; // 如果不等于这些Type,就不会输出一行记录。这些Type有特定的输出。 @@ -135,6 +138,11 @@ namespace Milimoe.FunGame.Server.Model case SocketMessageType.HeartBeat: msg = ""; break; + + case SocketMessageType.IntoRoom: + msg = "-1"; + if (args != null && args.Length > 0) msg = NetworkUtility.ConvertJsonObject(args[0])!; + break; } return Send(socket, type, msg); } @@ -154,8 +162,15 @@ namespace Milimoe.FunGame.Server.Model if (socket.Send(type, objs) == SocketResult.Success) { // Logout和Disconnect需要移除User与其线程 - if (type == SocketMessageType.Logout || type == SocketMessageType.Disconnect) + if (type == SocketMessageType.Logout) + { RemoveUser(); + } + if (type == SocketMessageType.Disconnect) + { + RemoveUser(); + Close(); + } object obj = objs[0]; if (obj.GetType() == typeof(string) && (string)obj != "") ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(ClientName, User) + " <- " + obj); @@ -238,8 +253,8 @@ namespace Milimoe.FunGame.Server.Model { RemoveUser(); GetUserCount(); - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " ERROR -> Too Many Faileds."); - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " CLOSE -> StreamReader is Closed."); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Too Many Faileds."); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StreamReader is Closed."); break; } } @@ -249,11 +264,30 @@ namespace Milimoe.FunGame.Server.Model { RemoveUser(); GetUserCount(); - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " ERROR -> Socket is Closed."); - ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " CLOSE -> StringStream is Closed."); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Error -> Socket is Closed."); + ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " Close -> StringStream is Closed."); break; } } } + + private void Close() + { + try + { + SQLHelper.Close(); + if (Socket != null) + { + Socket.Close(); + Socket = null; + } + Running = false; + } + catch (Exception e) + { + ServerHelper.Error(e); + } + } + } } diff --git a/FunGame.Server/Utility/DataUtility/MySQLHelper.cs b/FunGame.Server/Utility/DataUtility/MySQLHelper.cs index e3b29f7..fb1d29f 100644 --- a/FunGame.Server/Utility/DataUtility/MySQLHelper.cs +++ b/FunGame.Server/Utility/DataUtility/MySQLHelper.cs @@ -11,30 +11,20 @@ namespace Milimoe.FunGame.Server.Utility { public override string Script { get; set; } = ""; public override CommandType CommandType { get; set; } = CommandType.Text; - public MySqlParameter[] Parameters { get; set; } public override SQLResult Result => _Result; public override SQLServerInfo ServerInfo => _ServerInfo ?? SQLServerInfo.Create(); - public MySQLConnection? Connection => _Connection; public override int UpdateRows => _UpdateRows; public override DataSet DataSet => _DataSet; + public MySqlParameter[] Parameters { get; set; } + public MySQLConnection? Connection => _Connection; private SQLResult _Result = SQLResult.Success; private SQLServerInfo? _ServerInfo; private int _UpdateRows = 0; private DataSet _DataSet = new(); private MySQLConnection? _Connection; - - /// - /// 创建MySQLHelper实例 - /// - /// - /// - /// - /// - public static MySQLHelper GetHelper(string script = "", CommandType type = CommandType.Text, params MySqlParameter[] parameters) - { - return new MySQLHelper(script, type, parameters); - } + private bool _IsOneTime = false; + private string _ClientName = ""; /// /// 执行一个命令 @@ -43,10 +33,12 @@ namespace Milimoe.FunGame.Server.Utility /// 影响的行数 public override int Execute(out SQLResult Result) { - _Connection = new MySQLConnection(out _ServerInfo); + // _IsOneTime = true需要手动创建连接和关闭 + if (_IsOneTime) _Connection = new MySQLConnection(out _ServerInfo); ServerHelper.WriteLine("SQLQuery -> " + Script); + _DataSet = new DataSet(); _UpdateRows = MySQLManager.Execute(this, out Result); - Close(); + if (_IsOneTime) Close(); return _UpdateRows; } @@ -57,11 +49,11 @@ namespace Milimoe.FunGame.Server.Utility /// 结果集 public override DataSet ExecuteDataSet(out SQLResult Result) { - _Connection = new MySQLConnection(out _ServerInfo); + // _IsOneTime = true需要手动创建连接和关闭 + if (_IsOneTime) _Connection = new MySQLConnection(out _ServerInfo); ServerHelper.WriteLine("SQLQuery -> " + Script); - _DataSet = MySQLManager.ExecuteDataSet(this, out Result); - _UpdateRows = _DataSet.Tables[0].Rows.Count; - Close(); + _DataSet = MySQLManager.ExecuteDataSet(this, out Result, out _UpdateRows); + if (_IsOneTime) Close(); return DataSet; } @@ -70,21 +62,42 @@ namespace Milimoe.FunGame.Server.Utility /// public override void Close() { + // _IsOneTime = false需要手动调用此方法 _Connection?.Close(); - ServerHelper.WriteLine("Connection Release"); + ServerHelper.WriteLine($"{(_ClientName != "" ? _ClientName : "")} 已释放MySQL连接"); } /// /// 创建SQLHelper /// + /// 是否是单次使用的(执行完毕会自动Close连接) /// 存储过程名称或者script语句 /// 存储过程, 文本, 等等 /// 执行命令所用参数的集合 - private MySQLHelper(string script, CommandType type, params MySqlParameter[] parameters) + public MySQLHelper(bool IsOneTime = false, string script = "", CommandType type = CommandType.Text, params MySqlParameter[] parameters) { + _IsOneTime = IsOneTime; Script = script; CommandType = type; Parameters = parameters; + if (!IsOneTime) + { + _Connection = new MySQLConnection(out _ServerInfo); + } + } + + /// + /// 创建为SocketModel服务的SQLHelper + /// + /// Socket客户端名称 + public MySQLHelper(string ClientName) + { + _ClientName = ClientName; + _IsOneTime = false; + Script = ""; + CommandType = CommandType.Text; + Parameters = new MySqlParameter[] { }; + _Connection = new MySQLConnection(out _ServerInfo); } } } diff --git a/FunGame.Server/Utility/DataUtility/MySQLManager.cs b/FunGame.Server/Utility/DataUtility/MySQLManager.cs index c39a2e2..2a256b7 100644 --- a/FunGame.Server/Utility/DataUtility/MySQLManager.cs +++ b/FunGame.Server/Utility/DataUtility/MySQLManager.cs @@ -44,10 +44,11 @@ namespace Milimoe.FunGame.Server.Utility /// MySQLHelper /// 执行结果 /// 结果集 - public static DataSet ExecuteDataSet(MySQLHelper Helper, out SQLResult Result) + public static DataSet ExecuteDataSet(MySQLHelper Helper, out SQLResult Result, out int Rows) { MySqlCommand cmd = new(); DataSet ds = new(); + Rows = 0; try { @@ -61,7 +62,10 @@ namespace Milimoe.FunGame.Server.Utility //清除参数 cmd.Parameters.Clear(); - Result = SQLResult.Success; + + Rows = ds.Tables[0].Rows.Count; + if (Rows > 0) Result = SQLResult.Success; + else Result = SQLResult.NotFound; } catch (Exception e) {