Пример #1
0
    /// <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);
    }
Пример #2
0
    /// <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);
        }
    }