NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Net/Client/AppConfig.cs

183 lines
5.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//////////////////////////////////////////////////////////////////////////
//
// 文件Assets/Code/Scripts/Gameplay/Net/Client/AppConfig.cs
// 作者Xoen Xie
// 时间2023/07/19
// 描述app config
// 说明:
//
//////////////////////////////////////////////////////////////////////////
using Framework;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.Networking;
using System.Xml;
using System;
using System.IO;
using System.Text;
using BestHTTP;
using Cysharp.Threading.Tasks;
using PhxhSDK;
namespace Gameplay.Net
{
public struct AddrInfo
{
public string ip;
public uint port;
}
public struct ServerInfo
{
public string name;
public AddrInfo[] addrs;
}
public interface IAppConfigHandler
{
void OnAppConfigDone();
}
public sealed class AppConfig : Singlenton<AppConfig>, IInitable
{
#if UNITY_EDITOR
private readonly string appDir = "editor";
#elif UNITY_ANDROID
private readonly string appDir = "android";
#elif UNITY_IOS
private readonly string appDir = "ios";
#else
private readonly string appDir = "other";
#endif
private readonly string appURLPrefix = "https://nldgame.oss-cn-chengdu.aliyuncs.com";// editor/server.0.0.1.xml";
private string m_sAppUrl;
private List<ServerInfo> m_ServerInfos;
public ServerInfo Current { get; private set; }
public void Init()
{
string version = Application.version;
DebugUtil.Log("AppConfig Current App Version:{0}", version);
m_sAppUrl = $"{appURLPrefix}/{appDir}/server.{version}.xml";
DebugUtil.Log("AppConfig Current App Config Url:{0}", m_sAppUrl);
m_ServerInfos = new List<ServerInfo>();
}
public List<ServerInfo> GetServerInfo()
{
return m_ServerInfos;
}
public ServerInfo GetCurrent()
{
return Current;
}
public void Release()
{
}
public async UniTask Request()
{
DebugUtil.Log("AppConfig Request url={0}", m_sAppUrl);
HTTPRequest request = new HTTPRequest(new Uri(m_sAppUrl), OnRequestFinished);
request.Send();
while(m_ServerInfos.Count <= 0)
{
await UniTask.Delay(500);
}
}
private IAppConfigHandler m_handler;
public void RequestWithCallback(IAppConfigHandler h)
{
m_handler = h;
HTTPRequest request = new HTTPRequest(new Uri(m_sAppUrl), OnRequestFinished);
request.Send();
}
void OnRequestFinished(HTTPRequest request, HTTPResponse response)
{
switch (request.State)
{
// The request finished without any problem.
case HTTPRequestStates.Finished:
//Debug.Log("Request Finished! Text received: " + response.DataAsText);
OnServerInfo(response.DataAsText);
if(m_handler != null)
m_handler.OnAppConfigDone();
break;
default:
string text = "Request Finished with Error! " + (request.Exception != null ? (request.Exception.Message + "\n" + request.Exception.StackTrace) : "No Exception");
Debug.LogError(text);
break;
}
}
private void OnServerInfo(string text)
{
var settings = new XmlReaderSettings();
settings.IgnoreComments = true;
var reader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(text)), settings);
var doc = new XmlDocument();
doc.Load(reader);
var rootNode = doc.SelectSingleNode("root");
var nodeList = rootNode.SelectSingleNode("ServerList").ChildNodes;
for (var i = 0; i < nodeList.Count; ++i)
{
var ele = nodeList[i] as XmlElement;
ServerInfo sni;
sni.name = ele.GetAttribute("name");
sni.addrs = new AddrInfo[ele.ChildNodes.Count];
for (var J = 0; J < ele.ChildNodes.Count; J++)
{
var eleAddr = ele.ChildNodes[J] as XmlElement;
AddrInfo adi;
adi.ip = eleAddr.GetAttribute("ip");
string port = eleAddr.GetAttribute("port");
adi.port = Convert.ToUInt32(port);
sni.addrs[J] = adi;
}
DebugUtil.Log("AppConfig.OnServerInfo name={0}, count={1} ip={2}, port={3}",
sni.name, sni.addrs.Length, sni.addrs[0].ip, sni.addrs[0].port);
m_ServerInfos.Add(sni);
}
if(EventManager.Instance != null)
EventManager.Instance.Send(EventManager.EventName.NetLoginServerInfo);
}
public void Select(int nIndex)
{
if (nIndex >= m_ServerInfos.Count)
{
Current = m_ServerInfos[0];
DebugUtil.LogError("AppConfig Select nIndex:{0} >= m_ServerInfos.Count:{1}, set default as 0", nIndex, m_ServerInfos.Count);
return;
}
Current = m_ServerInfos[nIndex];
DebugUtil.Log("AppConfig Select name={0}, length={1}", Current.name, Current.addrs.Length);
}
}
}