using System.Collections;
using System.Net;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Text.RegularExpressions;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.Constant;
// 通用工具类,客户端和服务器端都可以直接调用的工具方法都可以写在这里
namespace Milimoe.FunGame.Core.Api.Utility
{
#region 网络服务
///
/// 网络服务工具箱
///
public class NetworkUtility
{
///
/// 判断字符串是否是IP地址
///
///
///
public static bool IsIP(string str) => Regex.IsMatch(str, @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$");
///
/// 判断字符串是否为邮箱地址
///
///
///
public static bool IsEmail(string str) => Regex.IsMatch(str, @"^(\w)+(\.\w)*@(\w)+((\.\w+)+)$");
///
/// 判断字符串是否是正常的用户名(只有中英文和数字)
///
///
///
public static bool IsUserName(string str) => Regex.IsMatch(str, @"^[\u4e00-\u9fa5A-Za-z0-9]+$");
///
/// 获取用户名长度
///
///
///
public static int GetUserNameLength(string str)
{
int length = 0;
for (int i = 0; i < str.Length; i++)
{
char c = str[i];
if (c is >= 'A' and <= 'Z' or >= 'a' and <= 'z' or >= '0' and <= '9') length++;
else length += 2;
}
return length;
}
///
/// 判断字符串是否是一个FunGame可接受的服务器地址
/// 此方法可以解析域名
///
///
///
///
/// 返回地址验证结果,同时输出服务器地址和端口号
public static ErrorIPAddressType IsServerAddress(string str, out string addr, out int port)
{
addr = "";
port = 22222;
string ip;
// 包含端口号时,需要先截取
string[] strs = str.Split(':');
if (strs.Length == 1)
{
addr = str;
}
else if (strs.Length > 1)
{
addr = strs[0];
port = int.Parse(strs[1]);
}
else if (strs.Length > 2)
{
return ErrorIPAddressType.WrongFormat;
}
try
{
ip = GetIPAddress(addr);
}
catch
{
ip = strs[0];
}
return IsServerAddress(ip, port);
}
///
/// 判断参数是否是一个FunGame可接受的服务器地址
///
///
///
///
public static ErrorIPAddressType IsServerAddress(string ip, int port)
{
if (IsIP(ip))
{
if (port > 0 && port < 65536)
{
return ErrorIPAddressType.None;
}
else
{
return ErrorIPAddressType.IsNotPort;
}
}
else if (port > 0 && port < 65536)
{
return ErrorIPAddressType.IsNotAddress;
}
else return ErrorIPAddressType.WrongFormat;
}
///
/// 获取服务器的延迟
///
/// 服务器IP地址
///
public static int GetServerPing(string addr)
{
Ping pingSender = new();
PingOptions options = new()
{
DontFragment = true
};
string data = "getserverping";
byte[] buffer = General.DefaultEncoding.GetBytes(data);
int timeout = 120;
PingReply reply = pingSender.Send(addr, timeout, buffer, options);
if (reply.Status == IPStatus.Success)
{
return Convert.ToInt32(reply.RoundtripTime);
}
return -1;
}
///
/// 解析域名为IP地址
///
///
///
///
internal static string GetIPAddress(string domain, System.Net.Sockets.AddressFamily family = System.Net.Sockets.AddressFamily.InterNetwork)
{
// 如果是域名,则解析为IP地址
IPHostEntry entrys = Dns.GetHostEntry(domain);
// 这里使用断言,请自行添加try catch配合使用
return entrys.AddressList.Where(addr => addr.AddressFamily == family).FirstOrDefault()!.ToString();
}
///
/// 返回目标对象的Json字符串
///
///
///
///
public static string JsonSerialize(T obj) => Service.JsonManager.GetString(obj);
///
/// 返回目标对象的Json字符串 可指定反序列化选项
///
///
///
///
///
public static string JsonSerialize(T obj, JsonSerializerOptions options) => Service.JsonManager.GetString(obj, options);
///
/// 反序列化Json对象
///
///
///
///
public static T? JsonDeserialize(string json) => Service.JsonManager.GetObject(json);
///
/// 反序列化Json对象 可指定反序列化选项
///
///
///
///
///
public static T? JsonDeserialize(string json, JsonSerializerOptions options) => Service.JsonManager.GetObject(json, options);
///
/// 反序列化Hashtable中的Json对象
///
///
///
///
///
public static T? JsonDeserializeFromHashtable(Hashtable hashtable, string key) => Service.JsonManager.GetObject(hashtable, key);
///
/// 反序列化IEnumerable中的Json对象
///
///
///
///
///
public static T? JsonDeserializeFromIEnumerable(IEnumerable