• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

u3d HTTP 最佳插件BestHttp

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2019/0422/464.html

 
选择besthttp pro 1.7.8 版本 支持64位IL2CPP处置;
Unity用来和效劳器通讯能够用原生的WWW,但是WWW所提供的功用并不多,不能满足很多需求。因而我们能够本人封装Http协议来满足更多的需求。在Unity游戏里运用Http协议的状况很常见,由于它操作简单,便于完成,经常用在登陆等场景下,还例如下载上传一些资源。假如想要完成进一步的控制,就要运用Socket并定义本人的协议了。
 
运用这个插件还有一个重点就在跨平台,由于用C#本人的HttpWebRequest也能完成。
 
下面扼要引见一下HTTP和Socket:
 
Http衔接:http衔接就是常州微信公众平台所谓的短衔接,即客户端向效劳器端发送一次恳求,效劳器端响应后衔接即会断掉;慢,不太合适游戏中实时数据的传输。数据量。
 
由于HTTP在每次恳求完毕后都会主动释放衔接,因而HTTP衔接是一种“短衔接”,要坚持客户端程序的在线状态,需求不时地向效劳器发起衔接恳求。通常的做法是即时不需求取得任何数据,客户端也坚持每隔一段固定的时间向效劳器发送一次“坚持衔接”的恳求,效劳器在收到该恳求后对客户端停止回复,标明晓得客户端“在线”。若效劳器长时间无法收到客户端的恳求,则以为客户端“下线”,若客户端长时间无法收到效劳器的回复,则以为网络曾经断开。
 
Socket衔接:socket衔接就是所谓的长衔接,理论上客户端和效劳器端一旦树立起衔接将不会主动断掉;但是由于各种环境要素可能会是衔接断开,比方说:效劳器端或客户端主机down了,网络毛病,或者两者之间长时间没有数据传输,网络防火墙可能会断开该衔接以释放网络资源。所以当一个socket衔接中没有数据的传输,那么为了维持衔接需求发送心跳音讯~~详细心跳音讯格式是常州微信小程序开发开发者本人定义的。
 
BestHttp是基于RFC 2616的Http/1.1完成,支持简直一切Unity支持的挪动和主机平台,详细请见官方文档。
 
以下引见主要来自于官方文档,会有一些补充信息。
 
BestHttp的目的是成为一款充沛发挥Http/1.1潜力的,易用并且强大的Unity插件。
 
装置:
需求将BestHttp目录下的Plugins目录挪动到Assets目录下,实践上脚本BestHTTPInstaller.cs会在导入完成后自动的完成这个过程,这里用到了[InitializeOnLoad]这个特性,我们稍后再说。
 
需求留意的一点是Unity低于3.5版本的话,需求删除Plugins目录下的WP8目录。
 
接下来开端一些根底的引见:
 
首先添加Using BestHttp; 的声明
 
Get Requests
最简单的向效劳器发出恳求的方法是创立一个HttpRequest对象,提供url和一个回调函数给结构函数。在创立了一个新的HttpRequest对象之后,我们只需求调用Send()函数就能够发送恳求了。
 
下面看常州网站开发建设一个例子:
 
1 HTTPRequest request = new HTTPRequest(new Uri(“https://google.com”), onRequestFinished);
2 request.Send();
3 void OnRequestFinished(HTTPRequest request, HTTPResponse response)
4 {
5   Debug.Log(“Request Finished! Text received: ” + response.DataAsText);
6 }
回调函数会收到两个参数,一个是原始的HTTPRequest 对象,另一个是承载效劳器响应的HTTPResponse 对象。假如出错的话,HTTPResponse 对象会是空,并且带有一个Exception属性来显现可能的错误。恳求是分别在不同的线程中处置的,而调用回调函数是在Unity的主线程中,所以我们不用去做任何的线程同步。
 
在这个例子里我们都不需求任何暂时变量,
 
new HTTPRequest(new Uri(“https://google.com”), (request, response) =>Debug.Log(“Finished!”)).Send();
POST Requests
上面的例子是一些简单的Get恳求,假如我们不指定办法,一切的的恳求都会默许是Get恳求。结构函数含有一个能够指定恳求办法的参数:
 
1 HTTPRequest request = new HTTPRequest(new Uri(“yourserver.com/posturi”),
2 HTTPMethods.Post,
3 OnRequestFinished);
4 request.AddField(“FieldName”, “Field Value”);
5 request.Send();
想要Post任何数据而不想设置域的话,游戏开发运营你能够运用RawData属性。
 
1 HTTPRequest request = new HTTPRequest(new Uri(“yourserver.com/posturi”),HTTPMethods.Post,OnRequestFinished);
4 request.RawData = Encoding.UTF8.GetBytes("Field Value");
5 request.Send();
除了GET和POST办法,其他办法也能够同样的运用。
 
如何获取下载的数据
 
通常我们都会经过恳求来获取效劳器的一些数据,原始的字节数据能够经过HTTPResponse 对象的Data属性取得,我们来看一个下载图片的例子:
 
1 new HTTPRequest(new Uri(“http://yourserver.com/path/to/image.png”), (request, response) =>
2 {
3   var tex = new Texture2D(0, 0);
4   tex.LoadImage(response.Data);
5   guiTexture.texture = tex;
6 }).Send();
当然还有更紧凑的方法:
 
new HTTPRequest(new Uri(“http://yourserver.com/path/to/image.png”), (request, response) =>
guiTexture.texture = response.DataAsTexture2D).Send();
除了DataAsTexture2D 还有一个DataAsText 属性用来将响应解析成UTF8的字符串。
 
留意:本文中的一切例子都没有停止错误检查,请在消费环境中本人添加判空。
 
你也能够借助StartCoroutine 来yield HTTPRequest ,
 
1 HTTPRequest request = new HTTPRequest(new Uri(“http://server.com”));
2 request.Send();
3 yield return StartCoroutine(request);
4 Debug.Log(“Request finished! Downloaded Data:” + request.Response.DataAsText);
Debug.Log只会在恳求完成后被调用。
 
高阶话题:
下面将会讨论BestHttp的一些高阶用法
 
我们能够很容易的经过HTTPRequest 的结构函数开启或关闭一些特性。下面是这些参数:
 
● methodType: 决议给效劳器发出什么恳求。默许的methodType
是HTTPMethods.Get.
● isKeepAlive:通知效劳器我们想 tcp 衔接坚持开启, 这样连续的Htttp恳求就不用再次翻开衔接。 假如我们坚持默许开启,会省下不少时间。 假如我们确信不会那么频繁的恳求,那么常州手游开发能够设为false。 默许值是true.
 
所以别希望这能替代socket的长衔接。
● disableCache: 通知BestHttp系统用或者不用整个缓存机制。假如这个值是true,那么系统不会去缓存里查找已存储的响应,
而且响应也不会被缓存。 默许值是 false.
考证系统
 
BestHTTP 经过HTTPRequest的认证属性支持根底和摘要认证:
 
 1 using BestHTTP.Authentication;
 2 var request = new HTTPRequest(new Uri("https://httpbin.org/digest-auth/auth-int/usr/paswd"), (req, resp)
 3 =>
 4 {
 5   if (resp.StatusCode != 401)
 6     Debug.Log("Authenticated");
 7   else
 8     Debug.Log("NOT Authenticated");
 9   Debug.Log(resp.DataAsText);
10 });
11 request.Credentials = new Credentials("usr", "paswd");
12 request.Send();
 
流媒体
 
我们为HTTPRequest的结构函数提供的回调函数默许只会在效劳器响应完整下载完成处置后被调用一次。假如采取这样的方式的话,在手机设备上下载大文件我们会很快用光内存,应用也就会解体。为了防止,BestHTTP 被设计成能够很容易的处置这类问题:只用把一个标志设为true,我们的回调函数会在每一次预定量的数据下载完成后被调用。另外假如常州游戏开发培训我们没关闭缓存,下载的响应会被缓存,这样我们就能够从本地缓存获取整个响应,并且不用该我们的代码也不用碰效劳器。(PS:效劳器必需发送正确的头:headers (“Expires”
header:)
 
 1 var request = new HTTPRequest(new Uri("http://yourserver.com/bigfile"), (req, resp) =>
 2 {
 3   List<byte[]> fragments = resp.GetStreamedFragments();
 4   // Write out the downloaded data to a file:
 5   using (FileStream fs = new FileStream("pathToSave", FileMode.Append))
 6   foreach(byte[] data in fragments)
 7     fs.Write(data, 0, data.Length);
 8   if (resp.IsStreamingFinished)
 9     Debug.Log(“Download finished!”);
10 });
11 request.UseStreaming = true;
12 request.StreamFragmentSize = 1 * 1024 * 1024; // 1 megabyte
13 request.DisableCache = true; // already saving to a file, so turn off caching
14 request.Send();
下面扼要描绘一下我们在上面所做的操作
1.我们切换了标志位-UseStreaming为true,所以我们的回调函数能够被重复调用。
 
2.StreamFragmentSize标示了我们在调用回调函数之前希望缓存的最大数据量。
 
3.每当StreamFragmentSize 大小的数据块下载后我们的回调函数就会被调用,并且在IsStreamingFinished 设为true之后还会再调用一次。
 
4.取得下载的数据需求调用GetStreamedFragments()函数,我们应该将它的结果保管在暂时变量里,由于内部缓存会在这次调用完毕后被清空,所以后续的调用会返回空。
 
5.我们在这个例子里关闭了缓存,由于我们曾经保管了下载的文件,并且我们不希望占领太多的空间。
 
缓存
 
缓存也是基于HTTP/1.1 RFC的。它用头信息来存储和考证响应。缓存机制在后台工作,我们只需求决议能否启用。假如缓存的响应有一个带有将来时间的’Expires‘头,BestHTTP 会用缓存的响应而且不会向效劳器考证。这意味着我们不需求初始化任何tcp衔接。这能让我们俭省时间、带宽,并且能够离线运用。
 
固然缓存是自动的,我们还是可以控制一些,或者说我们能够取得一些信息,经过运用HTTPCacheService 类的一些公共函数:
 
● BeginClear(): 它会在另外一个线程肃清一切的缓存。
● BeginMaintainence(): 经过这个函数,我们能够依据最近的访问时间删除缓存的条目。它会删除最后访问时间比指定时间早的缓存条目。 我们也能够用这个函数坚持缓存大小:
// 删除在最近两周没被访问的缓存, 然后删除条目以坚持缓存大小在50M以下, 从最早的开端.
HTTPCacheService.BeginMaintainence(new HTTPCacheMaintananceParams(TimeSpan.FromDays(14),
50 * 1024 * 1024));
● GetCacheSize(): 返回缓存大小,字节表示
 
● GetCacheEntryCount(): 返回存储在缓存里的条目数. 均匀的缓存条目大小能够被这样计算
float avgSize = GetCacheSize() / (float)GetCacheEntryCount() .

上篇:上一篇:C# String.split()用法小结
下篇:下一篇:Unity IOS项目启动页时间过长问题