From 57ce67fbbb7ad5b6a0ca3754d00f95581b02aa4d Mon Sep 17 00:00:00 2001 From: Mili Date: Tue, 3 Jan 2023 21:25:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E6=9E=B6=E6=9E=84=E5=88=9D=E4=BD=93?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FunGame.Server/Main.cs | 78 +++++++++------------ FunGame.Server/Model/ServerModel.cs | 103 ++++++++++++++-------------- 2 files changed, 84 insertions(+), 97 deletions(-) diff --git a/FunGame.Server/Main.cs b/FunGame.Server/Main.cs index 5824e9d..2ba5a7a 100644 --- a/FunGame.Server/Main.cs +++ b/FunGame.Server/Main.cs @@ -1,20 +1,18 @@ -using System.Net.Sockets; -using System.Net; -using System.Text; +using System.Text; using System.Text.RegularExpressions; using System; -using System.Net.WebSockets; using Milimoe.FunGame.Server.Utility; -using Milimoe.FunGame.Core.Library.Constant; -using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Server.Model; using Milimoe.FunGame.Server.Others; +using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Api.Utility; +using Milimoe.FunGame.Core.Library.Common.Network; Console.Title = Config.SERVER_NAME; Console.WriteLine(FunGameEnum.GetInfo((FunGameEnum.FunGame)Config.FunGameType)); bool Running = true; -Socket? ServerSocket = null; +ServerSocket? ListeningSocket = null; StartServer(); @@ -36,7 +34,7 @@ while (Running) ServerHelper.WriteLine("Milimoe -> 帮助"); break; case OrderDictionary.Restart: - if (ServerSocket == null) + if (ListeningSocket == null) { ServerHelper.WriteLine("重启服务器"); StartServer(); @@ -84,16 +82,12 @@ void StartServer() Running = false; throw new Exception("服务器遇到问题需要关闭,请重新启动服务器!"); } - - // 创建IP地址终结点对象 - IPEndPoint ip = new(IPAddress.Any, Config.SERVER_PORT); - - // 创建TCP Socket对象并绑定终结点 - ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); - ServerSocket.Bind(ip); + + // 创建监听 + ListeningSocket = ServerSocket.StartListening(); // 开始监听连接 - ServerSocket.Listen(Config.MAX_PLAYERS); + //ServerSocket.Listen(Config.MAX_PLAYERS); ServerHelper.WriteLine("Listen -> " + Config.SERVER_PORT); ServerHelper.WriteLine("服务器启动成功,开始监听 . . ."); @@ -104,14 +98,12 @@ void StartServer() while (Running) { - Socket socket; + ClientSocket socket; string clientIPaddress = ""; try { - socket = ServerSocket.Accept(); - IPEndPoint? clientIP = (IPEndPoint?)socket.RemoteEndPoint; - clientIPaddress = (clientIP != null) ? clientIP.ToString() : "Unknown"; - ServerHelper.WriteLine("客户端" + clientIPaddress + "连接 . . ."); + socket = ListeningSocket.Accept(); + ServerHelper.WriteLine("客户端" + socket.ClientIP + "连接 . . ."); if (Read(socket, clientIPaddress) && Send(socket, clientIPaddress)) { ServerModel cs = new(socket, Running); @@ -121,14 +113,15 @@ void StartServer() }); cs.Task = t; cs.ClientName = clientIPaddress; - Config.OnlineClients.Add(clientIPaddress, clientIPaddress); + if (!Config.OnlineClients.ContainsKey(clientIPaddress)) Config.OnlineClients.Add(clientIPaddress, clientIPaddress); } else ServerHelper.WriteLine("客户端" + clientIPaddress + "连接失败。"); } - catch + catch (Exception e) { ServerHelper.WriteLine("客户端" + clientIPaddress + "断开连接!"); + ServerHelper.Error(e); } } } @@ -136,56 +129,49 @@ void StartServer() { if (e.Message.Equals("服务器遇到问题需要关闭,请重新启动服务器!")) { - if (ServerSocket != null) + if (ListeningSocket != null) { - ServerSocket.Close(); - ServerSocket = null; + ListeningSocket.Close(); + ListeningSocket = null; } } ServerHelper.Error(e); } finally { - if (ServerSocket != null) + if (ListeningSocket != null) { - ServerSocket.Close(); - ServerSocket = null; + ListeningSocket.Close(); + ListeningSocket = null; } } }); } -bool Read(Socket socket, string name) +bool Read(ClientSocket socket, string name) { // 接收客户端消息 byte[] buffer = new byte[2048]; - int length = socket.Receive(buffer); - if (length > 0) + object[] read = socket.Receive(); + SocketMessageType type = (SocketMessageType)read[0]; + object[] objs = (object[])read[1]; + if (type != SocketMessageType.Unknown) { - string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); - string typestring = EnumHelper.GetSocketTypeName(SocketHelper.GetType(msg)); - msg = SocketHelper.GetMessage(msg); - if (typestring != SocketMessageType.Unknown.ToString()) - { - ServerHelper.WriteLine("[" + typestring + "] " + SocketHelper.MakeClientName(name) + " -> " + msg); - return true; - } - ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符,拒绝连接。"); - return false; + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(name) + " -> " + objs[0]); + return true; } - else - ServerHelper.WriteLine(SocketHelper.MakeClientName(name) + " 没有回应。"); + ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符,拒绝连接。"); return false; } -bool Send(Socket socket, string name) +bool Send(ClientSocket socket, string name) { // 发送消息给客户端 string msg = Config.SERVER_NAME + ";" + Config.SERVER_NOTICE; byte[] buffer = new byte[2048]; buffer = Config.DEFAULT_ENCODING.GetBytes($"1;{msg}"); - if (socket.Send(buffer) > 0) + if (socket.Send(SocketMessageType.Connect, msg, Guid.NewGuid().ToString()) == SocketResult.Success) { ServerHelper.WriteLine(SocketHelper.MakeClientName(name) + " <- " + "已确认连接"); return true; diff --git a/FunGame.Server/Model/ServerModel.cs b/FunGame.Server/Model/ServerModel.cs index c7896c8..5b7a400 100644 --- a/FunGame.Server/Model/ServerModel.cs +++ b/FunGame.Server/Model/ServerModel.cs @@ -2,7 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.IO; -using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Data.SqlTypes; @@ -11,6 +10,7 @@ using System.Net; using MySqlX.XDevAPI.Common; using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Core.Library.Constant; +using Milimoe.FunGame.Core.Library.Common.Network; using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Server.Others; @@ -23,7 +23,7 @@ namespace Milimoe.FunGame.Server.Model * Public */ public bool Running = false; - public Socket? Socket = null; + public ClientSocket? Socket = null; public Task? Task = null; public string ClientName = ""; @@ -32,7 +32,7 @@ namespace Milimoe.FunGame.Server.Model */ private User? User = null; - public ServerModel(Socket socket, bool running) + public ServerModel(ClientSocket socket, bool running) { Socket = socket; Running = running; @@ -40,78 +40,79 @@ namespace Milimoe.FunGame.Server.Model private int FailedTimes = 0; // 超过一定次数断开连接 - private bool Read(Socket socket) + private bool Read(ClientSocket socket) { // 接收客户端消息 try { - byte[] buffer = new byte[2048]; - int length = socket.Receive(buffer); - if (length > 0) + object[] objs = socket.Receive(); + SocketMessageType type = (SocketMessageType)objs[0]; + string msg = ""; + if (type != SocketMessageType.HeartBeat) { - string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); - int type = SocketHelper.GetType(msg); - string typestring = EnumHelper.GetSocketTypeName(type); - msg = SocketHelper.GetMessage(msg); - if (type != (int)SocketMessageType.HeartBeat) ServerHelper.WriteLine("[" + typestring + "] " + SocketHelper.MakeClientName(ClientName, User) + " -> " + msg); - switch (type) - { - case (int)SocketMessageType.GetNotice: - msg = Config.SERVER_NOTICE; - break; - case (int)SocketMessageType.Login: - break; - case (int)SocketMessageType.CheckLogin: - // 添加至玩家列表 - User = (User)Factory.New(msg); - msg = " >> 欢迎回来, " + msg + " 。"; - AddUser(); - ServerHelper.WriteLine("目前在线玩家数量: " + Config.OnlinePlayers.Count); - break; - case (int)SocketMessageType.Logout: - msg = " >> 你已成功退出登录! "; - RemoveUser(); - GetUserCount(); - break; - case (int)SocketMessageType.Disconnect: - msg = " >> 你已成功断开与服务器的连接: " + Config.SERVER_NAME + "。 "; - RemoveUser(); - GetUserCount(); - break; - case (int)SocketMessageType.HeartBeat: - msg = ""; - break; - } - return Send(socket, type, msg); + if (msg == "") + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(ClientName, User)); + else + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(ClientName, User) + " -> " + msg); } + switch (type) + { + case SocketMessageType.GetNotice: + msg = Config.SERVER_NOTICE; + break; + case SocketMessageType.Login: + break; + case SocketMessageType.CheckLogin: + // 添加至玩家列表 + User = (User)Factory.New(msg); + msg = "欢迎回来, " + msg + " 。"; + AddUser(); + GetUserCount(); + break; + case SocketMessageType.Logout: + msg = "你已成功退出登录! "; + GetUserCount(); + break; + case SocketMessageType.Disconnect: + msg = "你已成功断开与服务器的连接: " + Config.SERVER_NAME + "。 "; + GetUserCount(); + break; + case SocketMessageType.HeartBeat: + msg = ""; + break; + } + return Send(socket, type, msg); throw new Exception(); } - catch + catch (Exception e) { ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 没有回应。"); + ServerHelper.Error(e); return false; } } - private bool Send(Socket socket, int type, string msg, object[]? objs = null) + private bool Send(ClientSocket socket, SocketMessageType type, params object[] objs) { // 发送消息给客户端 try { - byte[] buffer = new byte[2048]; - buffer = Config.DEFAULT_ENCODING.GetBytes(Convert.ToString(SocketHelper.MakeMessage(type, msg))); - string typestring = EnumHelper.GetSocketTypeName(type); - if (socket.Send(buffer) > 0) + if (socket.Send(type, objs) == SocketResult.Success) { - if (msg != "") - ServerHelper.WriteLine("[" + typestring + "] " + SocketHelper.MakeClientName(ClientName, User) + " <- " + msg); + // Logout和Disconnect需要移除User与其线程 + if (type == SocketMessageType.Logout || type == SocketMessageType.Disconnect) + RemoveUser(); + object obj = objs[0]; + if (obj.GetType() == typeof(string) && (string)obj != "") + ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(ClientName, User) + " <- " + obj); return true; } - throw new Exception(); + throw new Exception("无法向客户端传输消息。"); } - catch + catch (Exception e) { ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 没有回应。"); + ServerHelper.Error(e); return false; } }