您的位置:首页 > 理论基础 > 计算机网络

Unity3D 网络通信_HTTP协议:获取网络图片、内容

2013-11-01 10:59 417 查看
自己写的测试demo,一个功能一个功能测试着做的,没有什么结构,凑合看吧。

http协议,在手机平台,URL必须必带http://头。

此脚本主要实现了 

分别用pose和get方式获取天气预报信息(XML格式)。
解析XML

获取网络图片
获取网络图片(base64格式)
base64与byte[]互转
byte[]与Texture2D(图片)互转

更多常用WEBService:http://www.webxml.com.cn/zh_cn/web_services.aspx

using UnityEngine;  

using System.Collections;  

using System.Collections.Generic;  

using System.Xml;  

using System.IO;  

  

public class HTTPDemo : MonoBehaviour  

{  

    public string HostName = "http://www.webxml.com.cn";  

    //城市天气预报服务   

    public string URLPath = "/WebServices/WeatherWebService.asmx/getWeatherbyCityName";  

    //获得验证码服务(直接获得图片)  

    private string PictureName = "/WebServices/ValidateCodeWebService.asmx/cnValidateImage?byString='Picture'";  

    //获得验证码服务(获得图片字节流)  

    private string PictureByteName = "/WebServices/ValidateCodeWebService.asmx/cnValidateByte?byString='picByte'";  

          

    private Texture2D mPicture;  

    private Texture2D mPictureByte;  

    private Texture2D mConvertPNG;  

  

    public string[] Parameters = new string[] { "theCityName" };  

  

    private string XMLContent = "null";  

  

    public string testC = "null";  

  

    void OnGUI()  

    {  

        //显示测试信息   

        GUI.Label(new Rect(100, 10, 1000, 38), testC);  

  

  

        //表单传值  

        if (GUI.Button(new Rect(10, 50, 100, 60), "post"))  

        {  

            postWeatherbyCityName("北京");  

        }  

        GUI.Button(new Rect(120, 80, 100 + getJindu() * 100, 20), (getJindu() * 100) + "%");  

  

  

        //get传值(android平台不支持中文参数)  

        if (GUI.Button(new Rect(10, 130, 100, 60), "get"))  

        {  

            getWeatherbyCityName("58367");//上海  

        }  

        GUI.Button(new Rect(120, 150, 100 + getJindu() * 100, 20), (getJindu() * 100) + "%");  

  

  

   

        //显示读取到的天气预报原始信息(xml格式)  

        GUI.Label(new Rect(10, 220, 380, 500), mContent);  

  

  

  

        //解析xml   

        if (GUI.Button(new Rect(500, 200, 120, 60), "AnalysisXML"))  

        {  

            XMLContent = AnalysisXML();  

        }  

        GUI.Label(new Rect(410, 220, 380, 500), XMLContent);  

  

  

  

        //下载网络图片   

        if (GUI.Button(new Rect(10, 750, 80, 60), "downPic"))  

        {  

            downloadPicture(PictureName);  

        }  

        GUI.Label(new Rect(100, 760, 200, 200), mPicture);  

  

  

        //下载网络图片 (base64格式)  

        if (GUI.Button(new Rect(350, 750, 80, 60), "downPicByte"))  

        {  

            downloadPictureByte(PictureByteName);  

        }  

        GUI.Label(new Rect(450, 760, 200, 200), mPictureByte);  

    }  

  

    public void postWeatherbyCityName(string str)  

    {  

        //将参数集合封装到Dictionary集合方便传值  

        Dictionary<string, string> dic = new Dictionary<string, string>();  

  

        //参数  

        dic.Add(Parameters[0], str);  

  

        StartCoroutine(POST(HostName + URLPath , dic));  

    }  

  

    public void getWeatherbyCityName(string str)  

    {  

        //将参数集合封装到Dictionary集合方便传值  

        Dictionary<string, string> dic = new Dictionary<string, string>();  

  

        //参数  

        dic.Add(Parameters[0], str);  

  

        StartCoroutine(GET(HostName + URLPath , dic));  

    }  

  

    //下载图片   

    public void downloadPicture(string picName)  

    {  

        testC ="picurl = " + picName;  

  

        StartCoroutine(GETTexture(HostName + picName));  

    }  

  

    //下载图片(字节流)  

    public void downloadPictureByte(string picName)  

    {  

        StartCoroutine(GETTextureByte(HostName + picName));  

    }  

  

    /*----------------------------------------------------Helper----------------------------------------------------------------------------*/  

  

    private float mJindu = 0;  

    private string mContent;  

  

    public float getJindu()  

    {  

        return mJindu;  

    }  

  

    //POST请求(Form表单传值、效率低、安全 ,)  

    IEnumerator POST(string url, Dictionary<string, string> post)  

    {  

        //表单   

        WWWForm form = new WWWForm();  

        //从集合中取出所有参数,设置表单参数(AddField()).  

        foreach (KeyValuePair<string, string> post_arg in post)  

        {  

            form.AddField(post_arg.Key, post_arg.Value);  

        }  

        //表单传值,就是post   

        WWW www = new WWW(url, form);  

  

        yield return www;  

        mJindu = www.progress;  

  

        if (www.error != null)  

        {  

            //POST请求失败  

            mContent =  "error :" + www.error;  

        }  

        else  

        {  

            //POST请求成功  

            mContent = www.text;  

        }  

    }  

  

    //GET请求(url?传值、效率高、不安全 )  

    IEnumerator GET(string url, Dictionary<string, string> get)  

    {  

        string Parameters;  

        bool first;  

        if (get.Count > 0)  

        {  

            first = true;  

            Parameters = "?";  

            //从集合中取出所有参数,设置表单参数(AddField()).  

            foreach (KeyValuePair<string, string> post_arg in get)  

            {  

                if (first)  

                    first = false;  

                else  

                    Parameters += "&";  

  

                Parameters += post_arg.Key + "=" + post_arg.Value;  

            }  

        }  

        else  

        {  

            Parameters = "";  

        }  

  

        testC ="getURL :" + Parameters;  

  

        //直接URL传值就是get  

        WWW www = new WWW(url + Parameters);  

        yield return www;  

        mJindu = www.progress;  

  

        if (www.error != null)  

        {  

            //GET请求失败  

            mContent = "error :" + www.error;  

        }  

        else  

        {  

            //GET请求成功  

            mContent = www.text;  

        }  

    }  

  

    IEnumerator GETTexture(string picURL)  

    {  

        WWW wwwTexture = new WWW(picURL);  

  

        yield return wwwTexture;  

  

        if (wwwTexture.error != null)  

        {  

            //GET请求失败  

            Debug.Log("error :" + wwwTexture.error);  

        }  

        else  

        {  

            //GET请求成功  

            mPicture = wwwTexture.texture;  

        }  

    }  

  

    string PicByte;  

    IEnumerator GETTextureByte(string picURL)  

    {  

        WWW www = new WWW(picURL);  

  

        yield return www;  

  

        if (www.error != null)  

        {  

            //GET请求失败  

            Debug.Log("error :" + www.error);  

        }  

        else  

        {  

            //GET请求成功  

            Debug.Log("PicBytes text = " + www.text);  

  

            XmlDocument xmlDoc = new XmlDocument();  

            xmlDoc.Load(new StringReader(www.text));  

  

            //通过索引查找子节点   

            PicByte = xmlDoc.GetElementsByTagName("base64Binary").Item(0).InnerText;  

            testC = PicByte;  

  

            mPictureByte = BttetoPic(PicByte);  

        }  

    }  

  

    //解析XML   

    string AnalysisXML()  

    {  

        string str = "";  

  

        XmlDocument xmlDoc = new XmlDocument();  

        xmlDoc.Load(new StringReader(mContent));  

  

        //得到文档根节点的所有子节点集合   

        //XmlNodeList nodes = xmlDoc.DocumentElement.ChildNodes;  

        //通过节点名得到节点集合  

        XmlNodeList nodes = xmlDoc.GetElementsByTagName("string");  

  

        //通过索引查找子节点   

        str += "item[1] = " + xmlDoc.GetElementsByTagName("string").Item(1).InnerText + "\n\n";  

  

        //遍历所有子节点  

        foreach (XmlElement element in nodes)  

        {  

            if (element.Name == "string")  

            {  

                str += element.InnerText + "\n";  

            }  

        }  

          

        return str;  

    }  

  

    //图片与byte[]互转  

    public void convertPNG(Texture2D pic)  

    {  

        byte[] data = pic.EncodeToPNG();  

        Debug.Log("data = " + data.Length + "|" + data[0]);  

        mConvertPNG = new Texture2D(200, 200);  

        mConvertPNG.LoadImage(data);  

    }  

  

    //byte[]与base64互转   

    Texture2D BttetoPic(string base64)  

    {   

        Texture2D pic = new Texture2D(200,200);  

        //将base64转码为byte[]   

        byte[] data = System.Convert.FromBase64String(base64);  

        //加载byte[]图片  

        pic.LoadImage(data);  

  

        string base64str = System.Convert.ToBase64String(data);  

        Debug.Log("base64str = " + base64str);  

  

        return pic;  

    }  

}  

分享到: 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: