新架构初体验

This commit is contained in:
Mili 2023-01-03 21:25:37 +08:00
parent b16ab517c2
commit 57ce67fbbb
2 changed files with 84 additions and 97 deletions

View File

@ -1,20 +1,18 @@
using System.Net.Sockets; using System.Text;
using System.Net;
using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System; using System;
using System.Net.WebSockets;
using Milimoe.FunGame.Server.Utility; 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.Model;
using Milimoe.FunGame.Server.Others; 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.Title = Config.SERVER_NAME;
Console.WriteLine(FunGameEnum.GetInfo((FunGameEnum.FunGame)Config.FunGameType)); Console.WriteLine(FunGameEnum.GetInfo((FunGameEnum.FunGame)Config.FunGameType));
bool Running = true; bool Running = true;
Socket? ServerSocket = null; ServerSocket? ListeningSocket = null;
StartServer(); StartServer();
@ -36,7 +34,7 @@ while (Running)
ServerHelper.WriteLine("Milimoe -> 帮助"); ServerHelper.WriteLine("Milimoe -> 帮助");
break; break;
case OrderDictionary.Restart: case OrderDictionary.Restart:
if (ServerSocket == null) if (ListeningSocket == null)
{ {
ServerHelper.WriteLine("重启服务器"); ServerHelper.WriteLine("重启服务器");
StartServer(); StartServer();
@ -84,16 +82,12 @@ void StartServer()
Running = false; Running = false;
throw new Exception("服务器遇到问题需要关闭,请重新启动服务器!"); throw new Exception("服务器遇到问题需要关闭,请重新启动服务器!");
} }
// 创建IP地址终结点对象 // 创建监听
IPEndPoint ip = new(IPAddress.Any, Config.SERVER_PORT); ListeningSocket = ServerSocket.StartListening();
// 创建TCP Socket对象并绑定终结点
ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
ServerSocket.Bind(ip);
// 开始监听连接 // 开始监听连接
ServerSocket.Listen(Config.MAX_PLAYERS); //ServerSocket.Listen(Config.MAX_PLAYERS);
ServerHelper.WriteLine("Listen -> " + Config.SERVER_PORT); ServerHelper.WriteLine("Listen -> " + Config.SERVER_PORT);
ServerHelper.WriteLine("服务器启动成功,开始监听 . . ."); ServerHelper.WriteLine("服务器启动成功,开始监听 . . .");
@ -104,14 +98,12 @@ void StartServer()
while (Running) while (Running)
{ {
Socket socket; ClientSocket socket;
string clientIPaddress = ""; string clientIPaddress = "";
try try
{ {
socket = ServerSocket.Accept(); socket = ListeningSocket.Accept();
IPEndPoint? clientIP = (IPEndPoint?)socket.RemoteEndPoint; ServerHelper.WriteLine("客户端" + socket.ClientIP + "连接 . . .");
clientIPaddress = (clientIP != null) ? clientIP.ToString() : "Unknown";
ServerHelper.WriteLine("客户端" + clientIPaddress + "连接 . . .");
if (Read(socket, clientIPaddress) && Send(socket, clientIPaddress)) if (Read(socket, clientIPaddress) && Send(socket, clientIPaddress))
{ {
ServerModel cs = new(socket, Running); ServerModel cs = new(socket, Running);
@ -121,14 +113,15 @@ void StartServer()
}); });
cs.Task = t; cs.Task = t;
cs.ClientName = clientIPaddress; cs.ClientName = clientIPaddress;
Config.OnlineClients.Add(clientIPaddress, clientIPaddress); if (!Config.OnlineClients.ContainsKey(clientIPaddress)) Config.OnlineClients.Add(clientIPaddress, clientIPaddress);
} }
else else
ServerHelper.WriteLine("客户端" + clientIPaddress + "连接失败。"); ServerHelper.WriteLine("客户端" + clientIPaddress + "连接失败。");
} }
catch catch (Exception e)
{ {
ServerHelper.WriteLine("客户端" + clientIPaddress + "断开连接!"); ServerHelper.WriteLine("客户端" + clientIPaddress + "断开连接!");
ServerHelper.Error(e);
} }
} }
} }
@ -136,56 +129,49 @@ void StartServer()
{ {
if (e.Message.Equals("服务器遇到问题需要关闭,请重新启动服务器!")) if (e.Message.Equals("服务器遇到问题需要关闭,请重新启动服务器!"))
{ {
if (ServerSocket != null) if (ListeningSocket != null)
{ {
ServerSocket.Close(); ListeningSocket.Close();
ServerSocket = null; ListeningSocket = null;
} }
} }
ServerHelper.Error(e); ServerHelper.Error(e);
} }
finally finally
{ {
if (ServerSocket != null) if (ListeningSocket != null)
{ {
ServerSocket.Close(); ListeningSocket.Close();
ServerSocket = null; ListeningSocket = null;
} }
} }
}); });
} }
bool Read(Socket socket, string name) bool Read(ClientSocket socket, string name)
{ {
// 接收客户端消息 // 接收客户端消息
byte[] buffer = new byte[2048]; byte[] buffer = new byte[2048];
int length = socket.Receive(buffer); object[] read = socket.Receive();
if (length > 0) SocketMessageType type = (SocketMessageType)read[0];
object[] objs = (object[])read[1];
if (type != SocketMessageType.Unknown)
{ {
string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(name) + " -> " + objs[0]);
string typestring = EnumHelper.GetSocketTypeName(SocketHelper.GetType(msg)); return true;
msg = SocketHelper.GetMessage(msg);
if (typestring != SocketMessageType.Unknown.ToString())
{
ServerHelper.WriteLine("[" + typestring + "] " + SocketHelper.MakeClientName(name) + " -> " + msg);
return true;
}
ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符拒绝连接。");
return false;
} }
else ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符拒绝连接。");
ServerHelper.WriteLine(SocketHelper.MakeClientName(name) + " 没有回应。");
return false; return false;
} }
bool Send(Socket socket, string name) bool Send(ClientSocket socket, string name)
{ {
// 发送消息给客户端 // 发送消息给客户端
string msg = Config.SERVER_NAME + ";" + Config.SERVER_NOTICE; string msg = Config.SERVER_NAME + ";" + Config.SERVER_NOTICE;
byte[] buffer = new byte[2048]; byte[] buffer = new byte[2048];
buffer = Config.DEFAULT_ENCODING.GetBytes($"1;{msg}"); 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) + " <- " + "已确认连接"); ServerHelper.WriteLine(SocketHelper.MakeClientName(name) + " <- " + "已确认连接");
return true; return true;

View File

@ -2,7 +2,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.IO; using System.IO;
using System.Net.Sockets;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Data.SqlTypes; using System.Data.SqlTypes;
@ -11,6 +10,7 @@ using System.Net;
using MySqlX.XDevAPI.Common; using MySqlX.XDevAPI.Common;
using Milimoe.FunGame.Server.Utility; using Milimoe.FunGame.Server.Utility;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Server.Others; using Milimoe.FunGame.Server.Others;
@ -23,7 +23,7 @@ namespace Milimoe.FunGame.Server.Model
* Public * Public
*/ */
public bool Running = false; public bool Running = false;
public Socket? Socket = null; public ClientSocket? Socket = null;
public Task? Task = null; public Task? Task = null;
public string ClientName = ""; public string ClientName = "";
@ -32,7 +32,7 @@ namespace Milimoe.FunGame.Server.Model
*/ */
private User? User = null; private User? User = null;
public ServerModel(Socket socket, bool running) public ServerModel(ClientSocket socket, bool running)
{ {
Socket = socket; Socket = socket;
Running = running; Running = running;
@ -40,78 +40,79 @@ namespace Milimoe.FunGame.Server.Model
private int FailedTimes = 0; // 超过一定次数断开连接 private int FailedTimes = 0; // 超过一定次数断开连接
private bool Read(Socket socket) private bool Read(ClientSocket socket)
{ {
// 接收客户端消息 // 接收客户端消息
try try
{ {
byte[] buffer = new byte[2048]; object[] objs = socket.Receive();
int length = socket.Receive(buffer); SocketMessageType type = (SocketMessageType)objs[0];
if (length > 0) string msg = "";
if (type != SocketMessageType.HeartBeat)
{ {
string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); if (msg == "")
int type = SocketHelper.GetType(msg); ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(ClientName, User));
string typestring = EnumHelper.GetSocketTypeName(type); else
msg = SocketHelper.GetMessage(msg); ServerHelper.WriteLine("[" + ServerSocket.GetTypeString(type) + "] " + SocketHelper.MakeClientName(ClientName, User) + " -> " + 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<User>(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);
} }
switch (type)
{
case SocketMessageType.GetNotice:
msg = Config.SERVER_NOTICE;
break;
case SocketMessageType.Login:
break;
case SocketMessageType.CheckLogin:
// 添加至玩家列表
User = (User)Factory.New<User>(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(); throw new Exception();
} }
catch catch (Exception e)
{ {
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 没有回应。"); ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 没有回应。");
ServerHelper.Error(e);
return false; 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 try
{ {
byte[] buffer = new byte[2048]; if (socket.Send(type, objs) == SocketResult.Success)
buffer = Config.DEFAULT_ENCODING.GetBytes(Convert.ToString(SocketHelper.MakeMessage(type, msg)));
string typestring = EnumHelper.GetSocketTypeName(type);
if (socket.Send(buffer) > 0)
{ {
if (msg != "") // Logout和Disconnect需要移除User与其线程
ServerHelper.WriteLine("[" + typestring + "] " + SocketHelper.MakeClientName(ClientName, User) + " <- " + msg); 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; return true;
} }
throw new Exception(); throw new Exception("无法向客户端传输消息。");
} }
catch catch (Exception e)
{ {
ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 没有回应。"); ServerHelper.WriteLine(SocketHelper.MakeClientName(ClientName, User) + " 没有回应。");
ServerHelper.Error(e);
return false; return false;
} }
} }