转载自 脱莫柔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

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

Unity3D 网络通信_HTTP相关推荐

  1. Unity 3D学习(三) - 网络通信

    目前没有找到合适的教程, 暂以此为学习大纲: Unity3D网络通信_图文_百度文库 第一章 网络游戏与单机游戏的区别 内容: 网络和单机游戏对比. 网络游戏的特点. 介绍网络的几种实现方式. 介绍本 ...

  2. 【Unity3D入门教程】网络通信

    Unity之前都是使用RPC来进行网络通信的,后来在Unity5中有了UNET,使得开发多人在线网络游戏变得非常简单.本文将会介绍使用新网络模块开发游戏的方法. 首选创建一个空工程,保存场景名字为&q ...

  3. unity3d 切换网络_【Unity3D入门教程】网络通信

    Unity之前都是使用RPC来进行网络通信的,后来在Unity5中有了UNET,使得开发多人在线网络游戏变得非常简单.本文将会介绍使用新网络模块开发游戏的方法. 首选创建一个空工程,保存场景名字为&q ...

  4. 在Unity3D中使用Protobuf3

    Protobuf:平台无关.语言无关.可扩展且轻便高效的序列化数据结构的协议,一般用于网络通信和数据存储 第一步:下载并准备DLL文件 链接:mvn9(或者 https://github.com/pr ...

  5. Unity3D数字孪生开发笔记——网络篇

    Unity3D数字孪生开发笔记(一) 一.网络连接的端点:Socket 二.端口 三.Socket通信流程 四.TCP和UDP 一.网络连接的端点:Socket 1.网络上的两个程序通过一个双向的通信 ...

  6. Unity中进行网络通信:三:unity客户端和Unity服务端互相发消息

    目录 一.目的 1.想知道:Unity中进行网络通信:unity客户端和Unity服务端互相发消息 二.参考 1.unity3D中使用Socket进行数据通信(三) 三.操作:一:完成:在同一个Uni ...

  7. 视频教程-游戏网络编程必备知识-Unity3D

    游戏网络编程必备知识 网名:海洋,CSDN社区讲师,3D游戏引擎开发者,IT讲师,计算机图形学方向研究生,曾在浙江大学CAD&CG;国家重点实验室学习.从事IT行业15年,主导或参与了18款大 ...

  8. 【unity3d】如何学习unity3d

    Unity3D是一个跨平台的游戏引擎,它提供了3d游戏的大部分基础功能实现,比如物理碰撞.3d模型显示.光照等功能,简化了使用者开发游戏的过程,更能够节省非常多的成本,unity3d与别的游戏引擎最大 ...

  9. 多人在线游戏开发 Unity3D 序言

    序言 这本书打算给你以步骤的方式,通过概念和使用unity游戏引擎使用中间插件创建多人游戏.我一直是一个痴迷于多人游戏的的粉丝.他们有方法轻触我们最基本的欲望,如充满了竞争,合作,以及和我们周围的人类 ...

最新文章

  1. D.Digits 思维dp 取log乘积变成加法
  2. 前端的小玩意(5)——用dojo写的二级下拉菜单自动添加功能
  3. 自己手写一个Mybatis框架(简化)
  4. Spring Boot 之发送邮件
  5. 基于句式元学习的Twitter分类
  6. 【转】Java抽象类与接口的区别
  7. caffeine 读操作源码走读 为什么读这么快
  8. 共享计算机脱机访问计算机,让Windows7脱机共享访问更安全 -电脑资料
  9. 程序员更像艺术家 哪种状态更具创造性?
  10. 分享 | 内核文件系统XFS的一些最新进展
  11. OneNET协议之LWM2M+CoAP
  12. vue随笔1-element-UI中checkbook多选框-复选框样式修改
  13. html求相关系数,相关系数,确定系数(R^2)计算公式与在线计算器_三贝计算网_23bei.com...
  14. 【javascript】详解javaScript的深拷贝
  15. 采购人必须明白的八大发展趋势及原则
  16. 《SQL Server 2008从入门到精通》--20180724
  17. 医疗行业大数据应用的三个案例
  18. Word撰写文章时EndNote引文作者-年份格式的几种显示形式
  19. 三维目标检测论文阅读:PointPillars: Fast Encoders for Object Detection from Point Clouds
  20. win10不兼容中文版的vc++ 6.0解决办法

热门文章

  1. 360视频加速器官方版
  2. [开箱评测] Thinkpad T440p 开箱及使用心得
  3. 绍兴市第十六届计算机复赛试题,绍兴市第十七届少儿信息学竞赛复赛试题
  4. 给代码写注释时有哪些讲究?
  5. nginx的access.log文件详解,main的具体意思
  6. ubuntu提示系统缺失字体:symbol、wingdings、wingdings2、wingdings3、webdings,WPS无法正确显示...
  7. Android studio编译跑步运动app一个安卓的跑步软件实时记录速度,画出跑步路径, 管理跑步数据履历,查看数据详细等
  8. 国外6个最好的广告联盟营销推荐
  9. 一文尽览!弱监督语义/实例/全景分割全面调研(2022最新综述)
  10. 无人驾驶或成为共享汽车真正的救星?