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

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

* 完成 WebSocket 消息处理系统

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

* 添加枚举

* 删除多余字符

* 添加监听器的名称

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

120 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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();
}
}
}