mirror of
https://github.com/project-redbud/FunGame-Core.git
synced 2025-04-22 20:19:34 +08:00

* 重做 WebSocket 监听;为服务器统一了多种数据连接访问时的处理;统一编码为 UTF-8 * ModelManager已更名并移动到工具命名空间中 * 完成 WebSocket 消息处理系统 * 添加Socket异步接收数据流;修复TaskUtility阻塞的问题;优化心跳、房间、模组 * 添加枚举 * 删除多余字符 * 添加监听器的名称 * 修改了命名
120 lines
3.5 KiB
C#
120 lines
3.5 KiB
C#
using Milimoe.FunGame.Core.Interface.Sockets;
|
||
using Milimoe.FunGame.Core.Library.Common.Architecture;
|
||
using Milimoe.FunGame.Core.Library.Common.Network;
|
||
|
||
namespace Milimoe.FunGame.Core.Controller
|
||
{
|
||
/// <summary>
|
||
/// <para>继承 AsyncAwaiter 用法:</para>
|
||
/// <para>1、调用Socket.Send()前,请设置为等待状态:SetWorking();</para>
|
||
/// <para>2、调用Socket.Send() == Success后,请等待任务完成:WaitForWorkDone();</para>
|
||
/// <para>3、在其他任何地方修改Working状态,均会使任务终止。</para>
|
||
/// </summary>
|
||
public class SocketHandlerController : AsyncAwaiter<SocketObject>, ISocketHandler, IDisposable
|
||
{
|
||
/// <summary>
|
||
/// 接收到的SocketObject实例
|
||
/// </summary>
|
||
protected override SocketObject Work { get; set; }
|
||
|
||
/// <summary>
|
||
/// Socket
|
||
/// </summary>
|
||
private readonly Socket? _Socket;
|
||
|
||
/// <summary>
|
||
/// WebSocket
|
||
/// </summary>
|
||
private readonly HTTPClient? _WebSocket;
|
||
|
||
/// <summary>
|
||
/// 继承请调用base构造
|
||
/// </summary>
|
||
/// <param name="socket">Socket</param>
|
||
public SocketHandlerController(Socket? socket)
|
||
{
|
||
if (socket != null)
|
||
{
|
||
_Socket = socket;
|
||
socket.AddSocketObjectHandler(SocketHandler);
|
||
}
|
||
else throw new SocketCreateReceivingException();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 继承请调用base构造
|
||
/// </summary>
|
||
/// <param name="websocket">Socket</param>
|
||
public SocketHandlerController(HTTPClient? websocket)
|
||
{
|
||
if (websocket != null)
|
||
{
|
||
_WebSocket = websocket;
|
||
websocket.AddSocketObjectHandler(SocketHandler);
|
||
}
|
||
else throw new SocketCreateReceivingException();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 继承请重写此方法
|
||
/// </summary>
|
||
/// <param name="SocketObject">SocketObject</param>
|
||
public virtual void SocketHandler(SocketObject SocketObject)
|
||
{
|
||
|
||
}
|
||
|
||
/// <summary>
|
||
/// 判断是否已经Disposed
|
||
/// </summary>
|
||
private bool IsDisposed = false;
|
||
|
||
/// <summary>
|
||
/// 公开的Dispose方法
|
||
/// </summary>
|
||
public void Dispose()
|
||
{
|
||
OnDisposed();
|
||
Dispose(true);
|
||
GC.SuppressFinalize(this);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关闭时
|
||
/// </summary>
|
||
/// <param name="Disposing"></param>
|
||
protected void Dispose(bool Disposing)
|
||
{
|
||
if (!IsDisposed)
|
||
{
|
||
if (Disposing)
|
||
{
|
||
_Socket?.RemoveSocketObjectHandler(SocketHandler);
|
||
_WebSocket?.RemoveSocketObjectHandler(SocketHandler);
|
||
}
|
||
}
|
||
IsDisposed = true;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 关闭事件
|
||
/// </summary>
|
||
protected delegate void DisposedEvent();
|
||
|
||
/// <summary>
|
||
/// <para>Controller关闭时事件</para>
|
||
/// <para>不建议new Dispose()方法,建议使用事件</para>
|
||
/// <para>事件会在base.Dispose()执行前触发</para>
|
||
/// </summary>
|
||
protected event DisposedEvent? Disposed;
|
||
|
||
/// <summary>
|
||
/// 触发关闭事件
|
||
/// </summary>
|
||
protected void OnDisposed()
|
||
{
|
||
Disposed?.Invoke();
|
||
}
|
||
}
|
||
}
|