/// <summary> /// 封装参数到reqHttpArgData /// </summary> /// <param name="cmd">协议号</param> /// <param name="args">具体内容</param> /// <param name="isNeedSession"></param> /// <returns></returns> private bool HttpProcess(int cmd, object[] args, bool isNeedSession) { if (args.Length % 2 != 0) { OnResult(ErrorType.ArgError); return(false); } int argLen = args.Length / 2; try { ReqHttpArgData data = new ReqHttpArgData { Cmd = (uint)cmd }; for (int i = 0; i < argLen; i++) { ReqHttpArgData.KeyVal arg = new ReqHttpArgData.KeyVal { Key = args[i * 2].ToString(), val = args[i * 2 + 1].ToString() }; data.Args.Add(arg); } if (coroutine != null) { httpManager.StopCoroutine(coroutine); } coroutine = httpManager.StartCoroutine(RequestData(domainUrl, data, isNeedSession)); } catch (Exception ex) { Debug.LogError("cmd :" + cmd + " err:" + ex.Message); } return(true); }
/// <summary> /// 发起http请求 /// 发送数据,接收返回数据 /// </summary> /// <param name="url"></param> /// <param name="data"></param> /// <returns></returns> private IEnumerator RequestData(string url, ReqHttpArgData data, bool isNeedSession) { if ((DateTime.Now - lastSendTime).TotalSeconds < 0.05f) { yield return(new WaitForEndOfFrame()); } lastSendTime = DateTime.Now; MemoryStream stream = new MemoryStream(); try { Serializer.Serialize(stream, data); } catch (Exception) { Debug.LogError("protobuf序列化失败"); } //加密 //登录时数据尾部添加默认uid //登录成功后返回 session和uid //再次http时数据尾部添加 session和uid ByteStream writer = null; try { if (isNeedSession) { if (sessionKey == null || sessionEnKey == null) { OnResult(ErrorType.ConnectError); yield break; } byte[] msgbody = EncryptUtils.AesEncrypt(stream.ToArray(), sessionEnKey); writer = new ByteStream(msgbody.Length + 24);//session 16 +uid 8 =24 writer.Write(msgbody); writer.Write(sessionKey); } else { byte[] msg = EncryptUtils.AesEncrypt(stream.ToArray(), defaultKey); writer = new ByteStream(msg.Length + 8);//uid 8 writer.Write(msg); writer.Write((ulong)0); } } catch (Exception ex) { Debug.LogError("加密失败 " + ex.Message); } ret = new WWW(url, writer.GetUsedBytes()); yield return(ret); if (ret.error == null && ret.bytes != null) { recvData = ret.bytes; ParseData(); } else { errorObject = ret.error; OnResult(ErrorType.ConnectError); } }