public void TestHttp()
{
Debug.Log("*****-----------hjgfhgfhgfh-----TestHttp--------gdfgdfg---------- *****");
HttpRequestData request = new HttpRequestData();
request.URL = "http://10.246.105.101/user/servertime?1622691859505";
request.RequestType = HttpType.Http_Get;
request.Callback_Success = OnHttpSuccessed;
request.Callback_Error = OnHttpFailed;
NetWorkManager.Instance.HttpRequest(request);
}
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using UnityEngine.Networking;
/// <summary>
/// 网络请求类型
/// </summary>
public enum NetWorkType
{
Type_Http,
Type_Tcp,
Type_Udp,
Type_All,
}
/// <summary>
/// http请求类型
/// </summary>
public enum HttpType
{
Http_Get,
Http_Post,
}
public class HttpRequestData
{
public string URL;
public HttpType RequestType;
public Action<string, byte[]> Callback_Success;
public Action<string> Callback_Error;
}
/// <summary>
/// 网络管理器
/// </summary>
[PreInit]
[OrderIndex((int)PreInitOrderIndexEnum.NetWorkManager)]
[Update]
public class NetWorkManager : Singleton<NetWorkManager>
{
#region Http
private static uint _http_idx;
/// <summary>
/// http请求对象池
/// 管理http的请求对象
/// </summary>
private static ObjectPool<NetWorkHttpRequest> _lt_httpRequestPool;
/// <summary>
/// http请求队列
/// 待处理的http请求
/// </summary>
private static ConcurrentDictionary<uint, NetWorkHttpRequest> _lt_allHttpRequests;
#endregion
private static uint _tcp_idx;
private static uint _udp_idx;
/// <summary>
/// udp客户端队列
/// </summary>
private static ConcurrentDictionary<uint, ClientSocket> _lt_allUdpClients;
/// <summary>
/// tcp客户端队列
/// </summary>
private static ConcurrentDictionary<uint, ClientSocket> _lt_allTcpClients;
/// <summary>
/// Socket对象池
/// 管理客户端的socket对象
/// </summary>
private static ObjectPool<ClientSocket> _lt_clientSockets;
public static T GetClientSocket<T>()
where T : ClientSocket
{
T t = _lt_clientSockets.Allocate() as T;
return t;
}
public static void AddUdpClient(ClientSocket client)
{
client.index = ++_udp_idx;
_lt_allUdpClients.TryAdd(_udp_idx, client);
}
/// <summary>
/// 初始化
/// </summary>
/// <param name="complete"></param>
public override void Init(InitCompleteCallback complete)
{
_http_idx = 0;
_lt_allHttpRequests = new ConcurrentDictionary<uint, NetWorkHttpRequest>();
_lt_httpRequestPool = new ObjectPool<NetWorkHttpRequest>(() => new NetWorkHttpRequest(), null, 100);
_tcp_idx = 0;
_lt_allTcpClients = new ConcurrentDictionary<uint, ClientSocket>();
_udp_idx = 0;
_lt_allUdpClients = new ConcurrentDictionary<uint, ClientSocket>();
_lt_clientSockets = new ObjectPool<ClientSocket>(() => new ClientSocket(), null, 10);
complete?.Invoke(true);
}
public override void BeforeRestart()
{
foreach (var pair in _lt_allHttpRequests)
{
_lt_httpRequestPool.Recycle(pair.Value);
}
_lt_allHttpRequests.Clear();
foreach (var pair in _lt_allTcpClients)
{
pair.Value.Disconnect();
_lt_clientSockets.Recycle(pair.Value);
}
foreach (var pair in _lt_allUdpClients)
{
pair.Value.Disconnect();
_lt_clientSockets.Recycle(pair.Value);
}
_lt_allTcpClients.Clear();
}
public override void Update()
{
ProgressHttpRequest();
ProgressTcpRequest();
ProgressUdpRequest();
}
#region Http Progress
/// <summary>
/// http请求
/// </summary>
/// <param name="requestData">请求数据对象</param>
public void HttpRequest(HttpRequestData requestData)
{
HttpRequest(requestData.URL, requestData.RequestType, requestData.Callback_Success, requestData.Callback_Error);
}
/// <summary>
/// http请求
/// </summary>
/// <param name="url">请求网址</param>
/// <param name="httpType">请求类型</param>
/// <param name="success_cb">成功的回调</param>
/// <param name="error_cb">失败的回调</param>
public void HttpRequest(string url, HttpType httpType, Action<string, byte[]> success_cb, Action<string> error_cb)
{
UnityWebRequest unityWebRequest;
if (httpType == HttpType.Http_Get)
{
unityWebRequest = new UnityWebRequest(url, "GET");
}
else
{
unityWebRequest = new UnityWebRequest(url, "POST");
}
unityWebRequest.timeout = 10;
unityWebRequest.downloadHandler = new DownloadHandlerBuffer();
NetWorkHttpRequest request = _lt_httpRequestPool.Allocate();
request.index = _http_idx++;
request.request = unityWebRequest;
request.callback_success = success_cb;
request.callback_error = error_cb;
request.isUsing = true;
request.asyncoperation = unityWebRequest.SendWebRequest();
_lt_allHttpRequests.TryAdd(request.index, request);
}
private void ProgressHttpRequest()
{
List<uint> keys = new List<uint>(_lt_allHttpRequests.Keys);
foreach (uint key in keys)
{
if(_lt_allHttpRequests.TryGetValue(key, out NetWorkHttpRequest request))
{
request.Update();
if (!request.isUsing)
{
_lt_httpRequestPool.Recycle(request);
_lt_allHttpRequests.TryRemove(key, out request);
}
}
}
}
#endregion
#region Tcp/Udp Progress
public void ConnetToServer(string ip, int port)
{
ClientSocket cs = _lt_clientSockets.Allocate();
cs.index = _tcp_idx++;
cs.Connect(ip, port);
_lt_allTcpClients.TryAdd(cs.index, cs);
}
private void ProgressTcpRequest()
{
List<uint> keys = new List<uint>(_lt_allTcpClients.Keys);
foreach (uint key in keys)
{
if (_lt_allTcpClients.TryGetValue(key, out ClientSocket clientSocket))
{
clientSocket.Update();
}
}
}
private void ProgressUdpRequest()
{
List<uint> keys = new List<uint>(_lt_allUdpClients.Keys);
foreach (uint key in keys)
{
if (_lt_allUdpClients.TryGetValue(key, out ClientSocket clientSocket))
{
clientSocket.Update();
}
}
}
#endregion
}
参考资料