milimoe 940f8397f1
为服务器统一数据访问连接 (#91)
* 重做 WebSocket 监听;为服务器统一了多种数据连接访问时的处理;统一编码为 UTF-8

* ModelManager已更名并移动到工具命名空间中

* 完成 WebSocket 消息处理系统

* 添加Socket异步接收数据流;修复TaskUtility阻塞的问题;优化心跳、房间、模组

* 添加枚举

* 删除多余字符

* 添加监听器的名称

* 修改了命名
2024-10-02 15:00:34 +08:00

114 lines
3.5 KiB
C#

using Milimoe.FunGame.Core.Interface.Base;
using Milimoe.FunGame.Core.Interface.Sockets;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Service;
namespace Milimoe.FunGame.Core.Library.Common.Network
{
public class ServerSocket(SocketListener listener, System.Net.Sockets.Socket instance, string clientIP, string clientName, Guid token) : IClientSocket, ISocketMessageProcessor
{
public SocketListener Listener { get; } = listener;
public System.Net.Sockets.Socket Instance { get; } = instance;
public SocketRuntimeType Runtime => SocketRuntimeType.Server;
public Guid Token { get; } = token;
public string ClientIP { get; } = clientIP;
public string ClientName => clientName;
public bool Connected => Instance != null && Instance.Connected;
public bool Receiving => _receiving;
public Type InstanceType => typeof(ServerSocket);
private Task? _receivingTask;
private bool _receiving;
private readonly HashSet<Action<SocketObject>> _boundEvents = [];
public void Close()
{
StopReceiving();
Instance.Close();
}
public async Task CloseAsync()
{
StopReceiving();
await Task.Run(() => Instance?.Close());
}
public SocketObject[] Receive()
{
try
{
return SocketManager.Receive(Instance);
}
catch
{
throw new SocketWrongInfoException();
}
}
public async Task<SocketObject[]> ReceiveAsync()
{
try
{
return await SocketManager.ReceiveAsync(Instance);
}
catch
{
throw new SocketWrongInfoException();
}
}
public SocketResult Send(SocketMessageType type, params object[] objs)
{
if (Instance != null)
{
if (SocketManager.Send(Instance, new(type, Token, objs)) == SocketResult.Success)
{
return SocketResult.Success;
}
else return SocketResult.Fail;
}
return SocketResult.NotSent;
}
public async Task<SocketResult> SendAsync(SocketMessageType type, params object[] objs)
{
if (Instance != null)
{
if (await SocketManager.SendAsync(Instance, new(type, Token, objs)) == SocketResult.Success)
{
return SocketResult.Success;
}
else return SocketResult.Fail;
}
return SocketResult.NotSent;
}
public void AddSocketObjectHandler(Action<SocketObject> method)
{
if (_boundEvents.Add(method))
{
SocketManager.SocketReceive += new SocketManager.SocketReceiveHandler(method);
}
}
public void RemoveSocketObjectHandler(Action<SocketObject> method)
{
_boundEvents.Remove(method);
SocketManager.SocketReceive -= new SocketManager.SocketReceiveHandler(method);
}
public void StartReceiving(Task t)
{
_receiving = true;
_receivingTask = t;
}
public void StopReceiving()
{
_receiving = false;
_receivingTask?.Wait(1);
_receivingTask = null;
}
}
}