using System.Net;
using System.Net.WebSockets;
using System.Text;
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.Service
{
internal class HTTPManager
{
///
/// 实际的 监听实例 [ 单例 ]
///
internal static HttpListener? HttpListener => _HttpListener;
private static HttpListener? _HttpListener = null;
///
/// 开始监听
/// 当 = "*" 时,需要管理员权限
///
///
///
///
///
///
internal static HttpListener StartListening(string address = "*", int port = 22223, string subUrl = "ws", bool ssl = false)
{
_HttpListener = new();
_HttpListener.Prefixes.Add((ssl ? "https://" : "http://") + address + ":" + port + "/" + subUrl.Trim('/') + "/");
_HttpListener.Start();
return _HttpListener;
}
///
/// 客户端连接远程 WebSocket 服务器
///
///
///
internal static async Task Connect(Uri uri)
{
System.Net.WebSockets.ClientWebSocket socket = new();
await socket.ConnectAsync(uri, CancellationToken.None);
if (socket.State == WebSocketState.Open)
{
return socket;
}
return null;
}
///
/// 客户端向服务器发送消息
///
///
///
///
internal static async Task Send(System.Net.WebSockets.ClientWebSocket socket, SocketObject obj)
{
if (socket != null)
{
try
{
await socket.SendAsync(new ArraySegment(General.DefaultEncoding.GetBytes(JsonManager.GetString(obj))), WebSocketMessageType.Text, true, CancellationToken.None);
return SocketResult.Success;
}
catch (Exception e)
{
TXTHelper.AppendErrorLog(e.GetErrorInfo());
return SocketResult.Fail;
}
}
return SocketResult.NotSent;
}
///
/// 服务器向客户端发送消息
///
///
///
///
internal static async Task Send(WebSocket socket, SocketObject obj)
{
if (socket != null)
{
try
{
await socket.SendAsync(new ArraySegment(General.DefaultEncoding.GetBytes(JsonManager.GetString(obj))), WebSocketMessageType.Text, true, CancellationToken.None);
return SocketResult.Success;
}
catch (Exception e)
{
TXTHelper.AppendErrorLog(e.GetErrorInfo());
return SocketResult.Fail;
}
}
return SocketResult.NotSent;
}
///
/// 服务器接受一个 HTTP 的 WebSocket 升级请求
///
/// [0]客户端IP地址;[1]客户端的WebSocket实例
internal static async Task