using System.Collections;
using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.Exception;
namespace Milimoe.FunGame.Core.Controller
{
///
/// 此类实现服务器连接、断开连接、心跳检测、创建数据请求等功能
/// -- 需要继承并实现部分方法 --
///
public abstract class RunTimeController
{
///
/// 与服务器的连接套接字实例
///
public Socket? Socket => _Socket;
///
/// 与服务器的连接套接字实例(WebSocket)
///
public HTTPClient? HTTPClient => _HTTPClient;
///
/// 套接字是否已经连接
///
public bool Connected => _Socket != null && _Socket.Connected;
///
/// 接收服务器信息的线程
///
protected Task? _ReceivingTask;
///
/// 用于类内赋值
///
protected Socket? _Socket;
///
/// 用于类内赋值
///
protected HTTPClient? _HTTPClient;
///
/// 是否正在接收服务器信息
///
protected bool _IsReceiving;
///
/// 断开服务器连接
///
///
public bool Disconnect()
{
bool result = false;
try
{
result = _Socket?.Send(SocketMessageType.Disconnect, "") == SocketResult.Success;
}
catch (Exception e)
{
WritelnSystemInfo(e.GetErrorInfo());
}
return result;
}
///
/// 发送结束游戏反馈
///
///
public bool EndGame()
{
bool result = false;
try
{
result = _Socket?.Send(SocketMessageType.EndGame, "") == SocketResult.Success;
}
catch (Exception e)
{
WritelnSystemInfo(e.GetErrorInfo());
}
return result;
}
///
/// 连接服务器 [ 可选参数需要根据连接方式提供 ]
/// 建议使用异步版,此方法为兼容性处理
///
///
///
///
///
///
///
public ConnectResult Connect(TransmittalType type, string address, int port, bool ssl = false, string subUrl = "")
{
return Task.Run(() => ConnectAsync(type, address, port, ssl, subUrl)).Result;
}
///
/// 连接服务器 [ 异步版,可选参数需要根据连接方式提供 ]
///
///
///
///
///
///
///
public async Task ConnectAsync(TransmittalType type, string address, int port = 0, bool ssl = false, string subUrl = "")
{
ArrayList connectArgs = [];
if (!BeforeConnect(ref address, ref port, connectArgs))
{
return ConnectResult.ConnectFailed;
}
ConnectResult result = ConnectResult.Success;
string msg;
string serverName = "";
string notice = "";
// 检查服务器地址和端口是否正确
if (address == "" || (type == TransmittalType.Socket && port <= 0) || (type == TransmittalType.WebSocket && port < 0))
{
result = ConnectResult.FindServerFailed;
}
if (result == ConnectResult.Success)
{
// 与服务器建立连接
if (type == TransmittalType.Socket)
{
connectArgs = await Connect_Socket(connectArgs, address, port);
}
else if (type == TransmittalType.WebSocket)
{
connectArgs = await Connect_WebSocket(connectArgs, address, ssl, port, subUrl);
}
else
{
result = ConnectResult.FindServerFailed;
msg = "连接服务器失败,未指定连接方式。";
connectArgs = [result, msg, serverName, notice];
}
}
AfterConnect(connectArgs);
// 允许修改数组中的result,强行改变连接的结果
if (connectArgs.Count > 0)
{
result = (ConnectResult?)connectArgs[0] ?? result;
}
return result;
}
///
/// 使用 Socket 方式连接服务器
///
///
///
///
///
private async Task Connect_Socket(ArrayList connectArgs, string address, int port)
{
ConnectResult result = ConnectResult.Success;
string msg = "";
string serverName = "";
string notice = "";
_Socket?.Close();
_Socket = Socket.Connect(address, port);
if (_Socket != null && _Socket.Connected)
{
if (_Socket.Send(SocketMessageType.Connect, connectArgs.Cast