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

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

2014-01-16 13:38 429 查看
原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 Unity3D引擎技术交流QQ群:【119706192】本文链接地址: Unity3D
网络通信_HTTP协议:获取网络图片内容

自己写的测试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;

}

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