这篇主要是提供完整的代码。。。注释较少请见谅,如果对流程有疑惑可以参考**《Unity游戏开发 基于多线程的Http网络框架基础篇》
完整篇除了基础篇讲到的内容之外,出于对性能和安全性的考虑还覆盖了如下内容:
单例:(BaseController)
**关于单例请参考《Unity游戏开发 单例基类》
对象池: (Poolable、PoolManager)
加密:(Encry)
这些内容后续有时间写的话会把链接放上来,目前把所有代码贴出来主要是方便直接拷贝就可以使用了。
在更完整的版本里还有一个事件分发的处理,后续如果有时间写UI框架的话会把这块关联起来。
目录
使用示例
void Start()
{
// 发起请求
HttpManager.instance.HttpPost(1, "http://es.dota2.uuu9.com/players", false);
}
int id = 0; int code = 0; string data = "";
void Update()
{
// 从接受队列取得消息(此处本来是和lua的http模块以及ui框架结合做错误码处理以及网络事件分发的)
if(HttpManager.instance.TryGetResPonse(ref id, ref code, ref data))
{
UnityEngine.Debug.LogError(data);
}
}
这里加密传了false,如果传入true的话会将返回的消息用Encry模块去解密。
这个需要服务器的配合,两边约定好加密的密钥。
目前只是对接收到的数据进行了解密处理,如果有需要的话也可以和服务器做协商,在发送的json参数中用某个字段将实际游戏中用到的参数通过Encry加密后保存起来发送给服务器,服务器解密后再做处理。
HttpManager(http管理器)
using System.Text;
public enum HttpType
{
Get,
Post,
}
public class HttpManager : BaseController<HttpManager>
{
private HttpClient _httpClient = new HttpClient();
private StringBuilder _getBuilder = new StringBuilder();
public void HttpGet(int key, string url, bool encry, string param = null)
{
_getBuilder.Clear();
_getBuilder.Append(url);
if (param != null)
{
_getBuilder.Append("?");
_getBuilder.Append(param);
}
_httpClient.AddHttpReq(key, HttpType.Get, _getBuilder.ToString(), encry);
}
public void HttpPost(int key, string url, bool encry, string param = null)
{
_getBuilder.Clear();
_getBuilder.Append(url);
_httpClient.AddHttpReq(key, HttpType.Post, _getBuilder.ToString(), encry, param);
}
public bool TryGetResPonse(ref int key, ref int code, ref string data)
{
HttpPack pack;
if (_httpClient.TryGetResponse(out pack))
{
key = pack.key;
code = pack.code;
data = pack.response;
pack.Dispose();
return true;
}
return false;
}
}
HttpClient(http核心逻辑)
using System.Net;
using System.Text;
using System.IO;
usi