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

  1. using UnityEngine;  
  2. using System.Collections;  
  3. using System.Collections.Generic;  
  4. using System.Xml;  
  5. using System.IO;  
  6.   
  7. public class HTTPDemo : MonoBehaviour  
  8. {  
  9.     public string HostName = "http://www.webxml.com.cn";  
  10.     //城市天气预报服务   
  11.     public string URLPath = "/WebServices/WeatherWebService.asmx/getWeatherbyCityName";  
  12.     //获得验证码服务(直接获得图片)  
  13.     private string PictureName = "/WebServices/ValidateCodeWebService.asmx/cnValidateImage?byString='Picture'";  
  14.     //获得验证码服务(获得图片字节流)  
  15.     private string PictureByteName = "/WebServices/ValidateCodeWebService.asmx/cnValidateByte?byString='picByte'";  
  16.           
  17.     private Texture2D mPicture;  
  18.     private Texture2D mPictureByte;  
  19.     private Texture2D mConvertPNG;  
  20.   
  21.     public string[] Parameters = new string[] { "theCityName" };  
  22.   
  23.     private string XMLContent = "null";  
  24.   
  25.     public string testC = "null";  
  26.   
  27.     void OnGUI()  
  28.     {  
  29.         //显示测试信息   
  30.         GUI.Label(new Rect(100, 10, 1000, 38), testC);  
  31.   
  32.   
  33.         //表单传值  
  34.         if (GUI.Button(new Rect(10, 50, 100, 60), "post"))  
  35.         {  
  36.             postWeatherbyCityName("北京");  
  37.         }  
  38.         GUI.Button(new Rect(120, 80, 100 + getJindu() * 100, 20), (getJindu() * 100) + "%");  
  39.   
  40.   
  41.         //get传值(android平台不支持中文参数)  
  42.         if (GUI.Button(new Rect(10, 130, 100, 60), "get"))  
  43.         {  
  44.             getWeatherbyCityName("58367");//上海  
  45.         }  
  46.         GUI.Button(new Rect(120, 150, 100 + getJindu() * 100, 20), (getJindu() * 100) + "%");  
  47.   
  48.   
  49.    
  50.         //显示读取到的天气预报原始信息(xml格式)  
  51.         GUI.Label(new Rect(10, 220, 380, 500), mContent);  
  52.   
  53.   
  54.   
  55.         //解析xml   
  56.         if (GUI.Button(new Rect(500, 200, 120, 60), "AnalysisXML"))  
  57.         {  
  58.             XMLContent = AnalysisXML();  
  59.         }  
  60.         GUI.Label(new Rect(410, 220, 380, 500), XMLContent);  
  61.   
  62.   
  63.   
  64.         //下载网络图片   
  65.         if (GUI.Button(new Rect(10, 750, 80, 60), "downPic"))  
  66.         {  
  67.             downloadPicture(PictureName);  
  68.         }  
  69.         GUI.Label(new Rect(100, 760, 200, 200), mPicture);  
  70.   
  71.   
  72.         //下载网络图片 (base64格式)  
  73.         if (GUI.Button(new Rect(350, 750, 80, 60), "downPicByte"))  
  74.         {  
  75.             downloadPictureByte(PictureByteName);  
  76.         }  
  77.         GUI.Label(new Rect(450, 760, 200, 200), mPictureByte);  
  78.     }  
  79.   
  80.     public void postWeatherbyCityName(string str)  
  81.     {  
  82.         //将参数集合封装到Dictionary集合方便传值  
  83.         Dictionary<stringstring> dic = new Dictionary<stringstring>();  
  84.   
  85.         //参数  
  86.         dic.Add(Parameters[0], str);  
  87.   
  88.         StartCoroutine(POST(HostName + URLPath , dic));  
  89.     }  
  90.   
  91.     public void getWeatherbyCityName(string str)  
  92.     {  
  93.         //将参数集合封装到Dictionary集合方便传值  
  94.         Dictionary<stringstring> dic = new Dictionary<stringstring>();  
  95.   
  96.         //参数  
  97.         dic.Add(Parameters[0], str);  
  98.   
  99.         StartCoroutine(GET(HostName + URLPath , dic));  
  100.     }  
  101.   
  102.     //下载图片   
  103.     public void downloadPicture(string picName)  
  104.     {  
  105.         testC ="picurl = " + picName;  
  106.   
  107.         StartCoroutine(GETTexture(HostName + picName));  
  108.     }  
  109.   
  110.     //下载图片(字节流)  
  111.     public void downloadPictureByte(string picName)  
  112.     {  
  113.         StartCoroutine(GETTextureByte(HostName + picName));  
  114.     }  
  115.   
  116.     /*----------------------------------------------------Helper----------------------------------------------------------------------------*/  
  117.   
  118.     private float mJindu = 0;  
  119.     private string mContent;  
  120.   
  121.     public float getJindu()  
  122.     {  
  123.         return mJindu;  
  124.     }  
  125.   
  126.     //POST请求(Form表单传值、效率低、安全 ,)  
  127.     IEnumerator POST(string url, Dictionary<stringstring> post)  
  128.     {  
  129.         //表单   
  130.         WWWForm form = new WWWForm();  
  131.         //从集合中取出所有参数,设置表单参数(AddField()).  
  132.         foreach (KeyValuePair<stringstring> post_arg in post)  
  133.         {  
  134.             form.AddField(post_arg.Key, post_arg.Value);  
  135.         }  
  136.         //表单传值,就是post   
  137.         WWW www = new WWW(url, form);  
  138.   
  139.         yield return www;  
  140.         mJindu = www.progress;  
  141.   
  142.         if (www.error != null)  
  143.         {  
  144.             //POST请求失败  
  145.             mContent =  "error :" + www.error;  
  146.         }  
  147.         else  
  148.         {  
  149.             //POST请求成功  
  150.             mContent = www.text;  
  151.         }  
  152.     }  
  153.   
  154.     //GET请求(url?传值、效率高、不安全 )  
  155.     IEnumerator GET(string url, Dictionary<stringstringget)  
  156.     {  
  157.         string Parameters;  
  158.         bool first;  
  159.         if (get.Count > 0)  
  160.         {  
  161.             first = true;  
  162.             Parameters = "?";  
  163.             //从集合中取出所有参数,设置表单参数(AddField()).  
  164.             foreach (KeyValuePair<stringstring> post_arg in get)  
  165.             {  
  166.                 if (first)  
  167.                     first = false;  
  168.                 else  
  169.                     Parameters += "&";  
  170.   
  171.                 Parameters += post_arg.Key + "=" + post_arg.Value;  
  172.             }  
  173.         }  
  174.         else  
  175.         {  
  176.             Parameters = "";  
  177.         }  
  178.   
  179.         testC ="getURL :" + Parameters;  
  180.   
  181.         //直接URL传值就是get  
  182.         WWW www = new WWW(url + Parameters);  
  183.         yield return www;  
  184.         mJindu = www.progress;  
  185.   
  186.         if (www.error != null)  
  187.         {  
  188.             //GET请求失败  
  189.             mContent = "error :" + www.error;  
  190.         }  
  191.         else  
  192.         {  
  193.             //GET请求成功  
  194.             mContent = www.text;  
  195.         }  
  196.     }  
  197.   
  198.     IEnumerator GETTexture(string picURL)  
  199.     {  
  200.         WWW wwwTexture = new WWW(picURL);  
  201.   
  202.         yield return wwwTexture;  
  203.   
  204.         if (wwwTexture.error != null)  
  205.         {  
  206.             //GET请求失败  
  207.             Debug.Log("error :" + wwwTexture.error);  
  208.         }  
  209.         else  
  210.         {  
  211.             //GET请求成功  
  212.             mPicture = wwwTexture.texture;  
  213.         }  
  214.     }  
  215.   
  216.     string PicByte;  
  217.     IEnumerator GETTextureByte(string picURL)  
  218.     {  
  219.         WWW www = new WWW(picURL);  
  220.   
  221.         yield return www;  
  222.   
  223.         if (www.error != null)  
  224.         {  
  225.             //GET请求失败  
  226.             Debug.Log("error :" + www.error);  
  227.         }  
  228.         else  
  229.         {  
  230.             //GET请求成功  
  231.             Debug.Log("PicBytes text = " + www.text);  
  232.   
  233.             XmlDocument xmlDoc = new XmlDocument();  
  234.             xmlDoc.Load(new StringReader(www.text));  
  235.   
  236.             //通过索引查找子节点   
  237.             PicByte = xmlDoc.GetElementsByTagName("base64Binary").Item(0).InnerText;  
  238.             testC = PicByte;  
  239.   
  240.             mPictureByte = BttetoPic(PicByte);  
  241.         }  
  242.     }  
  243.   
  244.     //解析XML   
  245.     string AnalysisXML()  
  246.     {  
  247.         string str = "";  
  248.   
  249.         XmlDocument xmlDoc = new XmlDocument();  
  250.         xmlDoc.Load(new StringReader(mContent));  
  251.   
  252.         //得到文档根节点的所有子节点集合   
  253.         //XmlNodeList nodes = xmlDoc.DocumentElement.ChildNodes;  
  254.         //通过节点名得到节点集合  
  255.         XmlNodeList nodes = xmlDoc.GetElementsByTagName("string");  
  256.   
  257.         //通过索引查找子节点   
  258.         str += "item[1] = " + xmlDoc.GetElementsByTagName("string").Item(1).InnerText + "\n\n";  
  259.   
  260.         //遍历所有子节点  
  261.         foreach (XmlElement element in nodes)  
  262.         {  
  263.             if (element.Name == "string")  
  264.             {  
  265.                 str += element.InnerText + "\n";  
  266.             }  
  267.         }  
  268.           
  269.         return str;  
  270.     }  
  271.   
  272.     //图片与byte[]互转  
  273.     public void convertPNG(Texture2D pic)  
  274.     {  
  275.         byte[] data = pic.EncodeToPNG();  
  276.         Debug.Log("data = " + data.Length + "|" + data[0]);  
  277.         mConvertPNG = new Texture2D(200, 200);  
  278.         mConvertPNG.LoadImage(data);  
  279.     }  
  280.   
  281.     //byte[]与base64互转   
  282.     Texture2D BttetoPic(string base64)  
  283.     {   
  284.         Texture2D pic = new Texture2D(200,200);  
  285.         //将base64转码为byte[]   
  286.         byte[] data = System.Convert.FromBase64String(base64);  
  287.         //加载byte[]图片  
  288.         pic.LoadImage(data);  
  289.   
  290.         string base64str = System.Convert.ToBase64String(data);  
  291.         Debug.Log("base64str = " + base64str);  
  292.   
  293.         return pic;  
  294.     }  
  295. }  




















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366243,如需转载请自行联系原作者






目录
打赏
0
0
0
0
101
分享
相关文章
利用HTTP POST协议实现简单的RPC协议,并使用WireShark进行抓包分析
通过这种方式,我们可以利用HTTP POST实现简单的RPC协议,并使用WireShark进行抓包分析。这种方式简单易懂,实用性强,可以应用于各种网络编程场景。
34 16
网络通讯技术:HTTP POST协议用于发送本地压缩数据到服务器的方案。
总的来说,无论你是一名网络开发者,还是普通的IT工作人员,理解并掌握POST方法的运用是非常有价值的。它就像一艘快速,稳定,安全的大船,始终为我们在网络海洋中的冒险提供了可靠的支持。
59 22
|
16天前
|
网络问题解析:如何解决CondaHTTPError HTTP 000 CONNECTION FAILED错误。
以上就是斯诺普为你准备的解决Conda出现HTTP连接错误的手术室。希望这辆小车可以顺利驶出棘手的泥潭,再次在自由的大路上疾驰。一切的尝试和努力,只为更好的探索与开发。
68 17
|
15天前
|
如何克服HTTP协议的无状态问题
总的来说,如何克服HTTP协议的无状态性,就是通过某种方式,让服务器或客户端“记住”一些信息。这其中,Cookie和Session是最经常使用的两种方式,其他的根据具体的应用场景来选择。
48 10
开发效率翻倍!Apipost这些协议调试秘籍,从HTTP到金融报文全搞定
Apipost是一款强大的API研发管理工具,支持多种协议与数据格式,包括HTTP(s)、WebSocket、SSE、gRPC、TCP及金融协议(如ISO 8583、FIX)。它内置国密算法库,提供HTTP文件秒传、全局参数配置等实用功能。在SSE调试中,可轻松处理AI模型流式响应;WebSocket与Socket.IO实现高效实时通信;GraphQL支持可视化Query编写;TCP模块解决金融报文编码难题;gRPC则具备服务反射与流式调试能力。Apipost不仅简化了多协议切换的复杂性,还自动生成文档,显著提升开发效率,让开发者专注于核心业务逻辑。
VB6网络通信软件上位机开发,TCP网络通信,读写数据并处理,完整源码下载
本文介绍使用VB6开发网络通信上位机客户端程序,涵盖Winsock控件的引入与使用,包括连接服务端、发送数据(如通过`Winsock1.SendData`方法)及接收数据(利用`Winsock1_DataArrival`事件)。代码实现TCP网络通信,可读写并处理16进制数据,适用于自动化和工业控制领域。提供完整源码下载,适合学习VB6网络程序开发。 下载链接:[完整源码](http://xzios.cn:86/WJGL/DownLoadDetial?Id=20)
59 12
掌握网络通信协议和技术:开发者指南
本文探讨了常见的网络通信协议和技术,如HTTP、SSE、GraphQL、TCP、WebSocket和Socket.IO,分析了它们的功能、优劣势及适用场景。开发者需根据应用需求选择合适的协议,以构建高效、可扩展的应用程序。同时,测试与调试工具(如Apipost)能助力开发者在不同网络环境下优化性能,提升用户体验。掌握这些协议是现代软件开发者的必备技能,对项目成功至关重要。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
TCP洪水攻击(SYN Flood)的诊断和处理 Posted by  海涛  on 2013 年 7 月 11 日 Tweet1 ​1. SYN Flood介绍 前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood。
1038 0
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
在运行一个group by的sql时,抛出以下错误信息: Task with the most failures(4):  -----Task ID:  task_201411191723_723592_m_000004URL:  http://DDS0204.
1020 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等