更新一些变量

This commit is contained in:
Mili 2022-11-24 00:29:06 +08:00
parent ec4e6dd780
commit e131fc44f6
5 changed files with 94 additions and 4 deletions

View File

@ -29,14 +29,21 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
public bool Receiving { get; private set; } = false; public bool Receiving { get; private set; } = false;
public bool SendingHeartBeat { get; private set; } = false; public bool SendingHeartBeat { get; private set; } = false;
private ServerSocket(System.Net.Sockets.Socket Instance, int ServerPort) private readonly ThreadManager PlayerThreads;
private ServerSocket(System.Net.Sockets.Socket Instance, int ServerPort, int MaxConnection = 0)
{ {
this.Instance = Instance; this.Instance = Instance;
this.ServerPort = ServerPort; this.ServerPort = ServerPort;
if (MaxConnection <= 0)
PlayerThreads = new ThreadManager();
else
PlayerThreads = new ThreadManager(MaxConnection);
} }
public ServerSocket StartListening(int Port = 22222, int MaxConnection = 20) public ServerSocket StartListening(int Port = 22222, int MaxConnection = 0)
{ {
if (MaxConnection <= 0) MaxConnection = SocketSet.MaxConnection_General;
System.Net.Sockets.Socket? socket = SocketManager.StartListening(Port, MaxConnection); System.Net.Sockets.Socket? socket = SocketManager.StartListening(Port, MaxConnection);
if (socket != null) return new ServerSocket(socket, Port); if (socket != null) return new ServerSocket(socket, Port);
else throw new System.Exception("无法创建监听,请重新启动服务器再试。"); else throw new System.Exception("无法创建监听,请重新启动服务器再试。");
@ -54,6 +61,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
throw new System.Exception("无法获取客户端信息。"); throw new System.Exception("无法获取客户端信息。");
} }
public bool AddClient(string ClientName, Task t)
{
return PlayerThreads.Add(ClientName, t);
}
public bool RemoveClient(string ClientName)
{
return PlayerThreads.Remove(ClientName);
}
public SocketResult Send(SocketMessageType type, params object[] objs) public SocketResult Send(SocketMessageType type, params object[] objs)
{ {
throw new System.Exception("监听Socket不能用于发送信息。"); throw new System.Exception("监听Socket不能用于发送信息。");

View File

@ -25,6 +25,9 @@ namespace Milimoe.FunGame.Core.Library.Constant
public class SocketSet public class SocketSet
{ {
public static int MaxRetryTimes { get; } = 20; public static int MaxRetryTimes { get; } = 20;
public static int MaxConnection_1C2G { get; } = 10;
public static int MaxConnection_General { get; } = 20;
public static int MaxConnection_4C4G { get; } = 40;
public const string Unknown = "Unknown"; public const string Unknown = "Unknown";
public const string Connect = "Connect"; public const string Connect = "Connect";

View File

@ -9,7 +9,14 @@ namespace Milimoe.FunGame.Core.Library.Constant
{ {
public class General public class General
{ {
// Static Variable
public static Empty EntityInstance { get; } = new(); public static Empty EntityInstance { get; } = new();
public static Encoding DEFAULT_ENCODING { get; } = Encoding.UTF8; public static Encoding DEFAULT_ENCODING { get; } = Encoding.UTF8;
// Const
public const int MaxRetryTimes = 20;
public const int MaxTask_1C2G = 10;
public const int MaxTask_General = 20;
public const int MaxTask_4C4G = 40;
} }
} }

View File

@ -30,8 +30,9 @@ namespace Milimoe.FunGame.Core.Service
/// <param name="Port">监听端口号</param> /// <param name="Port">监听端口号</param>
/// <param name="MaxConnection">最大连接数量</param> /// <param name="MaxConnection">最大连接数量</param>
/// <returns>服务器端专用Socket</returns> /// <returns>服务器端专用Socket</returns>
internal static Socket? StartListening(int Port = 22222, int MaxConnection = 20) internal static Socket? StartListening(int Port = 22222, int MaxConnection = 0)
{ {
if (MaxConnection <= 0) MaxConnection = SocketSet.MaxConnection_General;
try try
{ {
ServerSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ServerSocket = new(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

View File

@ -9,10 +9,35 @@ namespace Milimoe.FunGame.Core.Service
{ {
internal class ThreadManager internal class ThreadManager
{ {
internal static int MAX_THREAD { get; } = 20; /// <summary>
/// 最大接受的线程数量
/// </summary>
private int MaxConnection { get; }
/// <summary>
/// 可参与高并发的字典,但添加效率较低
/// </summary>
private ConcurrentDictionary<string, Task> Threads { get; } = new(); private ConcurrentDictionary<string, Task> Threads { get; } = new();
/// <summary>
/// Init ThreadManager
/// </summary>
/// <param name="MaxConnection">MaxConnection</param>
internal ThreadManager(int MaxConnection = 0)
{
if (MaxConnection <= 0)
this.MaxConnection = Library.Constant.General.MaxTask_General;
else
{
this.MaxConnection = MaxConnection;
}
}
/// <summary>
/// 获取Task对象
/// </summary>
/// <param name="name">Task的Key</param>
/// <returns>Task对象</returns>
internal Task this[string name] internal Task this[string name]
{ {
get get
@ -21,16 +46,53 @@ namespace Milimoe.FunGame.Core.Service
} }
} }
/// <summary>
/// 向线程管理器中添加Task
/// </summary>
/// <param name="name">Task的Key</param>
/// <param name="t">Task对象</param>
/// <returns>True操作成功</returns>
internal bool Add(string name, Task t) internal bool Add(string name, Task t)
{ {
if (Threads.Count + 1 > MaxConnection) return false;
return Threads.TryAdd(name, t); return Threads.TryAdd(name, t);
} }
/// <summary>
/// 从线程管理器中移除Task
/// </summary>
/// <param name="name">Task的Key</param>
/// <returns>True操作成功</returns>
internal bool Remove(string name) internal bool Remove(string name)
{ {
return Threads.TryRemove(name, out _); return Threads.TryRemove(name, out _);
} }
/// <summary>
/// 将Task移除并取得这个Task
/// </summary>
/// <param name="name">Task的Key</param>
/// <param name="t">Task对象</param>
/// <returns>被移除的Task</returns>
internal bool Remove(string name, ref Task? t)
{
return Threads.TryRemove(name, out t);
}
/// <summary>
/// 将Task移除并取得这个Task
/// </summary>
/// <param name="name">Task的Key</param>
/// <returns>被移除的Task</returns>
internal Task? RemoveAndGet(string name)
{
Threads.TryRemove(name, out Task? result);
return result;
}
/// <summary>
/// 清空线程管理器
/// </summary>
internal void Clear() internal void Clear()
{ {
Threads.Clear(); Threads.Clear();