Unity的弱聯網Json數據傳輸


注意事項:
關於dictionary轉json的工程中遇到一點問題:要手動添加雙引號。
關於json轉dictionary:同樣需要手動去掉雙引號,否則添加到dictionary中的字符串會帶有雙引號。打log的時候字符串輸出本身是沒有雙引號的。
 
返回Dictionary數據,代碼都很簡單,json的處理,當然也可以用其他json插件Litjson等,直接上代碼。
 
調用代碼:
  void Start () {
        Thread t = new Thread (Check);    // No need to explicitly use ThreadStart
        t.Start();
 
    }
    static string TestServer = "http://192.168.1.105:8080/cross";
    static void Check() {
        HttpClients httpClient = new HttpClients();
        Dictionary<string, string> data = new Dictionary<string, string>();
        if(result==null){
            result = new Dictionary<string, string>();
        }else{
            result.Clear();
        }
        data.Add("appName","cutit");
        data.Add("platform","android");
        data.Add("language","chinese");
        data.Add("channel","offical");
 
        ResultResponse resultResponse = httpClient.OpenPostUrl(TestServer,null,data);
        string resultString = resultResponse.GetContent().ToString();
        Dictionary<string, string>m = httpClient.JsonToDict(resultString);
        int resultCode = int.Parse(m["resultCode"]);
        if(resultCode ==0){
            string adState = "" + m["adState"];
            string isShowLogoText = "" + m["key1"];
            Debug.Log("steve:" + adState + ":" + isShowLogoText);
            if(adState == "OFF"){
                
            }
 
            if(isShowLogoText == "ON"){
            }
 
        }
    } 
以下是 HttpClient 和 ResultResponse
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
using UnityEngine;
using System.Text.RegularExpressions;


namespace HttpClient
{
 
    /// <summary>
    /// 通過Http協議訪問Web
    /// </summary>
    public class HttpClients
    {
        #region Cookie集合
        /// <summary>
        /// Cookie集合
        /// </summary>
        private CookieContainer cookies;
        #endregion
 
        #region Http user-agent標頭值
        /// <summary>
        /// Http user-agent標頭值
        /// </summary>
        public string UserAgent { get; set; }
        #endregion
 
        #region HttpClient構造函數
        public HttpClients()
        {
            this.cookies = new CookieContainer();
        }
        #endregion 
 
        #region 獲取HttpClient的Cookie集合
        /// <summary>
        /// 獲取HttpClient的Cookie集合
        /// </summary>
        /// <returns></returns>
        public CookieContainer GetCookieContainer()
        {
            return this.cookies;
        }
        #endregion
 
        #region 設置HttpClient的Cookie集合
        /// <summary>
        /// 設置HttpClient的Cookie集合
        /// </summary>
        /// <param name="_cookie">Cookie集合對象</param>
        /// <returns>True設置成功 False設置失敗</returns>
        public bool SetCookieContainer(CookieContainer _cookie)
        {
            if (_cookie != null)
            {
                this.cookies = _cookie;
                return true;
            }
            return false;
        }
        #endregion
 
        #region 以GET方式打開一個Http連接
        /// <summary>
        /// 以GET方式打開一個Http連接
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">請求頭</param>
        /// <returns></returns>
        public ResultResponse OpenGetUrl(string url, Dictionary<string, string> headers)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClients.ConnectionType.GET;
            request.KeepAlive = true;
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            return new ResultResponse(response);
        }
        #endregion
 
        #region 以GET方式打開一個Http連接,302自定義處理行為
        /// <summary>
        /// 以GET方式打開一個Http連接,302自定義處理行為
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">請求頭</param>
        /// <param name="action">302跳轉處理</param>
        /// <returns></returns>
        public ResultResponse OpenGetUrlRedirect(string url, Dictionary<string, string> headers,HttpClients.RedirectAction action)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClients.ConnectionType.GET;
            request.KeepAlive = true;
            request.AllowAutoRedirect = false; //302不采用默認行為處理
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            ResultResponse result=new ResultResponse(response);
            if (response.StatusCode == HttpStatusCode.Found)
            {
                bool ret = true;
                if (action != null)
                {
                    ret = action(result);
                }
                string locationurl = response.Headers["Location"];
                if (ret == true)
                {
                    return this.OpenGetUrlRedirect(locationurl, null, action);
                }
                return result;
            }
            return result;
        }
        #endregion
 
        #region Http 302跳轉處理
        /// <summary>
        /// Http 302跳轉處理
        /// </summary>
        /// <param name="result">響應對象</param>
        /// <returns>False 不繼續跳轉 True繼續跳轉</returns>
        public delegate bool RedirectAction(ResultResponse result);
        #endregion
 
        #region 將Http標頭值添加到Request對象中
        /// <summary>
        /// 將Http標頭值添加到Request對象中
        /// </summary>
        /// <param name="headers"></param>
        private void FillHeaders(HttpWebRequest request,Dictionary<string, string> headers)
        {
            if (headers != null && headers.Count > 0)
            {
                Dictionary<string, string>.Enumerator em = headers.GetEnumerator();
                while (em.MoveNext())
                {
                    request.Headers.Add(em.Current.Key, em.Current.Value);
                }
            }
        }
        #endregion
 
        #region 以POST方式打開一個Http連接
        /// <summary>
        /// 以POST方式打開一個Http連接
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">請求頭</param>
        /// <param name="data">發送的數據</param>
        /// <returns></returns>
        public ResultResponse OpenPostUrl(string url,Dictionary<string,string> headers,Dictionary<string,string> data)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClients.ConnectionType.POST;
            request.KeepAlive = true;
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            byte[] buff = DictToBytes(data);
            request.GetRequestStream().Write(buff, 0, buff.Length);
            request.GetRequestStream().Close();
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            return new ResultResponse(response);
        }
        #endregion
 
        #region 以POST方式打開一個Http連接,302自定義處理行為
        /// <summary>
        /// 以POST方式打開一個Http連接,302自定義處理行為
        /// </summary>
        /// <param name="url">地址</param>
        /// <param name="headers">請求頭</param>
        /// <param name="data">發送的數據</param>
        /// <param name="action">302自定義處理</param>
        /// <returns></returns>
        public ResultResponse OpenPostUrlRedirect(string url, Dictionary<string, string> headers, Dictionary<string, string> data,HttpClients.RedirectAction action)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.CookieContainer = this.cookies;
            request.Method = HttpClients.ConnectionType.POST;
            request.KeepAlive = true;
            request.AllowAutoRedirect = false;
            if (this.UserAgent != null && this.UserAgent != "")
            {
                request.UserAgent = this.UserAgent;
            }
            this.FillHeaders(request, headers);
            byte[] buff = DictToBytes(data);
            request.GetRequestStream().Write(buff, 0, buff.Length);
            request.GetRequestStream().Close();
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            ResultResponse result = new ResultResponse(response);
 
            if (response.StatusCode == HttpStatusCode.Found)
            {
                bool ret = true;
                if (action != null)
                {
                    ret = action(result);
                }
                string locationurl = response.Headers["Location"];
                return result;
            }
            return result;
        }
        #endregion
 
        #region 將字典的key和value拼接成http參數
        /// <summary>
        /// 將字典的key和value拼接成http參數
        /// </summary>
        /// <param name="dic">參數</param>
        /// <returns></returns>
        private byte[] DictToBytes(Dictionary<string, string> dic)
        {
            StringBuilder sb = null;
            if (dic != null)
            {
                Dictionary<string,string>.Enumerator em= dic.GetEnumerator();
                sb = new StringBuilder();
                sb.Append("{");
                while (em.MoveNext())
                {
                    sb.Append(String.Format("{0}:{1};", '"'+ em.Current.Key + '"', '"' + em.Current.Value + '"'));
                }
                sb.Remove (sb.Length-1,1);
                sb.Append("}");
                return System.Text.Encoding.UTF8.GetBytes(sb.ToString());
            }
            return null;
        }

        public Dictionary<string, string> JsonToDict(string json)
        {
            StringBuilder sb = new StringBuilder(json);
            Dictionary<string, string> result = new Dictionary<string, string>();
            if (json != null && json != "") {
                sb.Remove (0, 1);
                sb.Remove (sb.Length - 1, 1);
                string t = "" + sb;
                string[] temp = Regex.Split (t, ",", RegexOptions.IgnoreCase);

                for (int i = 0; i < temp.Length; i++) {    
                    temp[i] = Regex.Replace (temp [i], "\"","", RegexOptions.IgnoreCase);
                    string[] splits = Regex.Split (temp [i],":", RegexOptions.IgnoreCase);
                    result.Add (splits [0].ToString(), splits [1].ToString());
                }

                return result;
            }

            return null;
        }

        #endregion
 
        #region HttpClient打開連接的方式
        /// <summary>
        /// HttpClient打開連接的方式
        /// </summary>
        public static class ConnectionType
        {
            public static string GET { get { return "GET"; } }
            public static string POST { get { return "POST"; } }
        }
        #endregion
 
 
 
 
    }
}

 

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Text;
 
namespace HttpClient
{
 
    /// <summary>
    ///包含服務器響應數據的對象
    /// </summary>
    public class ResultResponse
    {
        #region HttpWebResponse對象
        /// <summary>
        /// HttpWebResponse對象
        /// </summary>
        private HttpWebResponse m_response;
        #endregion
 
        #region 創建一個HttpWebResponse對象
        /// <summary>
        /// 創建一個HttpWebResponse對象
        /// </summary>
        /// <param name="_response">HttpWebResponse</param>
        public ResultResponse(HttpWebResponse _response)
        {
            this.m_response = _response;
        }
        #endregion
 
        #region 獲取響應內容的二進制流
        /// <summary>
        /// 獲取響應內容的二進制流 
        /// </summary>
        /// <returns></returns>
        public Stream GetResponseStream()
        {
            if (this.m_response != null)
            {
                return this.m_response.GetResponseStream();
            }
            return null;
        }
        #endregion
 
        #region Http版本
        /// <summary>
        /// Http版本
        /// </summary>
        public string ProtocolVersion { get { return this.m_response != null ? this.m_response.ProtocolVersion.ToString() : ""; } }
        #endregion
        /// <summary>
        /// 響應方法
        /// </summary>
        public string Method { get { return this.m_response != null ? this.m_response.Method : ""; } }
        /// <summary>
        /// Http狀態碼
        /// </summary>
        public string StatusCode { get { return this.m_response != null ? this.m_response.StatusCode.ToString() : ""; } }
        /// <summary>
        /// Http響應頭
        /// </summary>
        public WebHeaderCollection Headers { get { return this.m_response != null ? this.m_response.Headers : null;} }
 
        /// <summary>
        /// 響應流的字符編碼
        /// </summary>
        /// <returns></returns>
        public Encoding getResponseEncoding()
        {
            if (this.m_response != null)
            {
                return Encoding.GetEncoding(this.m_response.ContentEncoding);
            }
            return null;
        }
 
        /// <summary>
        /// 獲取響應內容的字符串
        /// </summary>
        /// <param name="encoding">字符串編碼(默認utf8)</param>
        /// <returns></returns>
        public string GetContent(string encoding="utf-8")
        {
            return System.Text.Encoding.GetEncoding(encoding).GetString(this.StreamtoBytes(this.GetResponseStream()));

//            return System.Text.Encoding.GetEncoding(encoding).GetString(this.StreamtoBytes(this.GetResponseStream()));
        }
 
        /// <summary>
        /// 獲取原始的HttpWebResponse
        /// </summary>
        /// <returns></returns>
        public HttpWebResponse GetRawResponse()
        {
            return this.m_response;
        }
 
        /// <summary>
        /// 二進制流轉換成字節數組
        /// </summary>
        /// <param name="_stream"></param>
        /// <returns></returns>
        private byte[] StreamtoBytes(Stream _stream)
        {
            byte[] buff;
            int rlen;
            MemoryStream _ms;
            if (_stream != null)
            {
                buff = new byte[1024];
                rlen = 0;
                _ms = new MemoryStream();
                while ((rlen = _stream.Read(buff, 0, 1024)) > 0)
                {
                    _ms.Write(buff, 0, rlen);
                }
                buff = _ms.ToArray();
                _ms.Close();
                _ms.Dispose();
                return buff;
            }
            return null;
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM