Unity中的HTTP网络通信

    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


}

参考资料 

Unity中的HTTP网络通信

Unity Http Post请求之Json参数

unity携带header发送POST请求

UnityWebRequest http json通信

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值