实现退出登录

This commit is contained in:
Mili 2022-09-16 22:30:23 +08:00
parent c69e6ff0bf
commit 53c6eab3e4
5 changed files with 87 additions and 30 deletions

View File

@ -26,13 +26,13 @@ while (Running)
{ {
switch (order) switch (order)
{ {
case "quit": case OrderDictionary.Quit:
Running = false; Running = false;
break; break;
case "help": case OrderDictionary.Help:
ServerHelper.WriteLine("Milimoe -> 帮助"); ServerHelper.WriteLine("Milimoe -> 帮助");
break; break;
case "restart": case OrderDictionary.Restart:
if (ServerSocket == null) if (ServerSocket == null)
{ {
ServerHelper.WriteLine("重启服务器"); ServerHelper.WriteLine("重启服务器");
@ -73,6 +73,8 @@ void StartServer()
Console.Title = Config.SERVER_NAME + " - FunGame Server Port: " + Config.SERVER_PORT; Console.Title = Config.SERVER_NAME + " - FunGame Server Port: " + Config.SERVER_PORT;
} }
Config.DefaultDataHelper.Close();
// 连接MySQL服务器 // 连接MySQL服务器
if (!Config.DefaultDataHelper.Connect()) if (!Config.DefaultDataHelper.Connect())
{ {
@ -104,20 +106,19 @@ void StartServer()
{ {
socket = ServerSocket.Accept(); socket = ServerSocket.Accept();
IPEndPoint? clientIP = (IPEndPoint?)socket.RemoteEndPoint; IPEndPoint? clientIP = (IPEndPoint?)socket.RemoteEndPoint;
if (clientIP != null) string clientIPaddress = (clientIP != null) ? clientIP.ToString() : "Unknown";
ServerHelper.WriteLine("客户端" + clientIP.ToString() + "连接 . . ."); ServerHelper.WriteLine("客户端" + clientIPaddress + "连接 . . .");
else
ServerHelper.WriteLine("未知地点客户端连接 . . .");
if (Read(socket) && Send(socket)) 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 else
if (clientIP != null) ServerHelper.WriteLine("客户端" + clientIPaddress + "连接失败。");
ServerHelper.WriteLine("客户端" + clientIP.ToString() + "连接失败。");
else
ServerHelper.WriteLine("客户端连接失败。");
} }
catch (Exception e) catch (Exception e)
{ {
@ -157,9 +158,9 @@ bool Read(Socket socket)
if (length > 0) if (length > 0)
{ {
string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); 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); msg = SocketHelper.GetMessage(msg);
if (typestring != CommonEnums.SocketType.Unknown.ToString()) if (typestring != SocketMessageType.Unknown.ToString())
{ {
ServerHelper.WriteLine("[ 客户端(" + typestring + "] -> " + msg); ServerHelper.WriteLine("[ 客户端(" + typestring + "] -> " + msg);
return true; return true;
@ -177,7 +178,7 @@ bool Send(Socket socket)
// 发送消息给客户端 // 发送消息给客户端
string msg = " >> 已连接至服务器:" + Config.SERVER_NAME + "。\n\n********** 服务器公告 **********\n\n" + Config.SERVER_NOTICE + "\n\n"; string msg = " >> 已连接至服务器:" + Config.SERVER_NAME + "。\n\n********** 服务器公告 **********\n\n" + Config.SERVER_NOTICE + "\n\n";
byte[] buffer = new byte[2048]; 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) if (socket.Send(buffer) > 0)
{ {
ServerHelper.WriteLine("[ 客户端 ] <- " + "已确认连接"); ServerHelper.WriteLine("[ 客户端 ] <- " + "已确认连接");

View File

@ -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";
}
}

View File

@ -12,6 +12,7 @@ using System.Reflection.Metadata;
using FunGame.Core.Api.Model.Entity; using FunGame.Core.Api.Model.Entity;
using System.Net; using System.Net;
using FunGame.Core.Api.Model.Enum; using FunGame.Core.Api.Model.Enum;
using MySqlX.XDevAPI.Common;
namespace FunGameServer.Sockets namespace FunGameServer.Sockets
{ {
@ -19,8 +20,9 @@ namespace FunGameServer.Sockets
{ {
public bool Running { get; set; } = false; public bool Running { get; set; } = false;
public Socket? Socket { get; set; } = null; public Socket? Socket { get; set; } = null;
public Task? Task = null;
private User? user = null; private User? User = null;
public ClientSocket(Socket socket, bool running) public ClientSocket(Socket socket, bool running)
{ {
@ -41,22 +43,49 @@ namespace FunGameServer.Sockets
{ {
string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length); string msg = Config.DEFAULT_ENCODING.GetString(buffer, 0, length);
int type = SocketHelper.GetType(msg); int type = SocketHelper.GetType(msg);
string typestring = CommonEnums.GetSocketTypeName(type); string typestring = EnumHelper.GetSocketTypeName(type);
msg = SocketHelper.GetMessage(msg); 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) switch (type)
{ {
case (int)CommonEnums.SocketType.GetNotice: case (int)SocketMessageType.GetNotice:
msg = Config.SERVER_NOTICE; msg = Config.SERVER_NOTICE;
break; break;
case (int)CommonEnums.SocketType.Login: case (int)SocketMessageType.Login:
break; break;
case (int)CommonEnums.SocketType.CheckLogin: case (int)SocketMessageType.CheckLogin:
msg = ">> 欢迎回来, " + msg + " 。"; // 添加至玩家列表
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; 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; break;
case (int)CommonEnums.SocketType.HeartBeat: case (int)SocketMessageType.HeartBeat:
msg = ""; msg = "";
break; break;
} }
@ -78,7 +107,7 @@ namespace FunGameServer.Sockets
{ {
byte[] buffer = new byte[2048]; byte[] buffer = new byte[2048];
buffer = Config.DEFAULT_ENCODING.GetBytes(Convert.ToString(SocketHelper.MakeMessage(type, msg))); 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 (socket.Send(buffer) > 0)
{ {
if (msg != "") if (msg != "")

View File

@ -1,4 +1,5 @@
using FunGame.Core.Api.Model.Entity; using FunGame.Core.Api.Model.Entity;
using FunGame.Core.Api.Model.Enum;
using FunGameServer.Models.Config; using FunGameServer.Models.Config;
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using System; using System;
@ -6,7 +7,6 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using static FunGame.Core.Api.Model.Enum.CommonEnums;
namespace FunGameServer.Utils namespace FunGameServer.Utils
{ {
@ -51,5 +51,14 @@ namespace FunGameServer.Utils
} }
return false; return false;
} }
public void Close()
{
if (msc != null && msc.State == System.Data.ConnectionState.Open)
{
msc.Close();
}
msc = null;
}
} }
} }

View File

@ -1,4 +1,5 @@
using FunGameServer.Models.Config; using FunGame.Core.Api.Model.Enum;
using FunGameServer.Models.Config;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
@ -6,7 +7,6 @@ using System.Linq;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using static FunGame.Core.Api.Model.Enum.CommonEnums;
namespace FunGameServer.Utils namespace FunGameServer.Utils
{ {
@ -68,7 +68,10 @@ namespace FunGameServer.Utils
public static void InitOrderList() 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) public static bool IsIP(string ip)