mirror of
https://github.com/project-redbud/FunGame-Server.git
synced 2025-04-22 03:59:36 +08:00
新架构初体验
This commit is contained in:
parent
b16ab517c2
commit
57ce67fbbb
@ -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();
|
||||||
@ -85,15 +83,11 @@ void StartServer()
|
|||||||
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));
|
|
||||||
msg = SocketHelper.GetMessage(msg);
|
|
||||||
if (typestring != SocketMessageType.Unknown.ToString())
|
|
||||||
{
|
|
||||||
ServerHelper.WriteLine("[" + typestring + "] " + SocketHelper.MakeClientName(name) + " -> " + msg);
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符,拒绝连接。");
|
ServerHelper.WriteLine("客户端发送了不符合FunGame规定的字符,拒绝连接。");
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
else
|
|
||||||
ServerHelper.WriteLine(SocketHelper.MakeClientName(name) + " 没有回应。");
|
|
||||||
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;
|
||||||
|
@ -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)
|
switch (type)
|
||||||
{
|
{
|
||||||
case (int)SocketMessageType.GetNotice:
|
case SocketMessageType.GetNotice:
|
||||||
msg = Config.SERVER_NOTICE;
|
msg = Config.SERVER_NOTICE;
|
||||||
break;
|
break;
|
||||||
case (int)SocketMessageType.Login:
|
case SocketMessageType.Login:
|
||||||
break;
|
break;
|
||||||
case (int)SocketMessageType.CheckLogin:
|
case SocketMessageType.CheckLogin:
|
||||||
// 添加至玩家列表
|
// 添加至玩家列表
|
||||||
User = (User)Factory.New<User>(msg);
|
User = (User)Factory.New<User>(msg);
|
||||||
msg = " >> 欢迎回来, " + msg + " 。";
|
msg = "欢迎回来, " + msg + " 。";
|
||||||
AddUser();
|
AddUser();
|
||||||
ServerHelper.WriteLine("目前在线玩家数量: " + Config.OnlinePlayers.Count);
|
|
||||||
break;
|
|
||||||
case (int)SocketMessageType.Logout:
|
|
||||||
msg = " >> 你已成功退出登录! ";
|
|
||||||
RemoveUser();
|
|
||||||
GetUserCount();
|
GetUserCount();
|
||||||
break;
|
break;
|
||||||
case (int)SocketMessageType.Disconnect:
|
case SocketMessageType.Logout:
|
||||||
msg = " >> 你已成功断开与服务器的连接: " + Config.SERVER_NAME + "。 ";
|
msg = "你已成功退出登录! ";
|
||||||
RemoveUser();
|
|
||||||
GetUserCount();
|
GetUserCount();
|
||||||
break;
|
break;
|
||||||
case (int)SocketMessageType.HeartBeat:
|
case SocketMessageType.Disconnect:
|
||||||
|
msg = "你已成功断开与服务器的连接: " + Config.SERVER_NAME + "。 ";
|
||||||
|
GetUserCount();
|
||||||
|
break;
|
||||||
|
case SocketMessageType.HeartBeat:
|
||||||
msg = "";
|
msg = "";
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return Send(socket, type, msg);
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user