Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 欧美激情小说网,国产综合亚洲精品一区,日本最新伦中文字幕

          整合營(yíng)銷(xiāo)服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢(xún)熱線(xiàn):

          使用C 開(kāi)發(fā)HTTP服務(wù)器系列之實(shí)現(xiàn)Get和Post

          使用C 開(kāi)發(fā)HTTP服務(wù)器系列之實(shí)現(xiàn)Get和Post

          我們這個(gè)Web服務(wù)器有了一個(gè)基本的門(mén)面以后,我們是時(shí)候來(lái)用它做點(diǎn)實(shí)際的事情了。還記得我們最早提到HTTP協(xié)議的用途是什么嗎?它叫超文本傳輸協(xié)議啊,所以我們必須考慮讓我們的服務(wù)器能夠接收到客戶(hù)端傳來(lái)的數(shù)據(jù)。因?yàn)槲覀兡壳巴瓿闪舜蟛糠值墓ぷ鳎詫?duì)數(shù)據(jù)傳輸這個(gè)問(wèn)題我們這里選擇以最簡(jiǎn)單的GET和POST為例來(lái)實(shí)現(xiàn),這樣我們今天的重點(diǎn)就落實(shí)在Get和Post的實(shí)現(xiàn)這個(gè)問(wèn)題上來(lái)。而從原理上來(lái)講,無(wú)論Get方式請(qǐng)求還是Post方式請(qǐng)求,我們都可以在請(qǐng)求報(bào)文中獲得其請(qǐng)求參數(shù),不同的是前者出現(xiàn)在請(qǐng)求行中,而后者出現(xiàn)在消息體中。例如我們傳遞的兩個(gè)參數(shù)num1和num2對(duì)應(yīng)的數(shù)值分別是12和24,那么在具體的請(qǐng)求報(bào)文中我們都能找到類(lèi)似“num1=12&num2=24”這樣的字符結(jié)構(gòu),所以只要針對(duì)這個(gè)字符結(jié)構(gòu)進(jìn)行解析,就可以獲得客戶(hù)端傳遞給服務(wù)器的參數(shù)啦。

          實(shí)現(xiàn)Get請(qǐng)求

          首先我們來(lái)實(shí)現(xiàn)Get請(qǐng)求,Get是HTTP協(xié)議中默認(rèn)的請(qǐng)求類(lèi)型,我們平時(shí)訪(fǎng)問(wèn)網(wǎng)頁(yè)、請(qǐng)求資源實(shí)際上都是通過(guò)Get方式實(shí)現(xiàn)的。Get方式請(qǐng)求需要通過(guò)類(lèi)似“?id=001&option=10”這樣的形式附加在URL上,因此Get方式對(duì)瀏覽器來(lái)說(shuō)是透明的,即用戶(hù)可以通過(guò)瀏覽器地址欄知道,這個(gè)過(guò)程中傳遞了哪些參數(shù)以及這些參數(shù)的值分別是什么。而由于瀏覽器的限制,我們通過(guò)這種方式請(qǐng)求的時(shí)候能夠傳遞的參數(shù)數(shù)目和長(zhǎng)度都是有限的,而且當(dāng)參數(shù)中存在中文數(shù)值的時(shí)候還需要對(duì)其進(jìn)行編碼。Get方式請(qǐng)求相對(duì)簡(jiǎn)單,我們下面來(lái)看看它的請(qǐng)求報(bào)文:

          GET /?num1=23&num2=12 HTTP/1.1
          Accept: text/html, application/xhtml+xml, image/jxr, */*
          Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
          User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
          Accept-Encoding: gzip, deflate
          Host: localhost:4040
          Connection: Keep-Alive
          Cookie: _ga=GA1.1.1181222800.1463541781
          1
          2
          3
          4
          5
          6
          7
          8
          

          此時(shí)我們可以注意到在請(qǐng)求報(bào)文第一行,即請(qǐng)求行中出現(xiàn)了“/?num1=23&num2=12”這樣的字樣,這就是客戶(hù)端傳遞給服務(wù)器的參數(shù),我們很容易想到只需要將這個(gè)字段串中的“鍵”和“值”都解析出來(lái),服務(wù)器就可以對(duì)這些數(shù)據(jù)進(jìn)行處理然后返回給客戶(hù)端了。所以下面我們通過(guò)這樣的方式來(lái)實(shí)現(xiàn),我們?yōu)镠tttpRequest類(lèi)增加了一個(gè)Parms屬性,它是一個(gè)鍵和值均為字符串類(lèi)型的字典,我們使用這個(gè)字典來(lái)存儲(chǔ)和管理客戶(hù)端傳遞來(lái)的參數(shù)。

          //獲取請(qǐng)求參數(shù)
          if(this.Method=="GET" && this.URL.Contains('?'))
           this.Params=GetRequestParams(lines[0].Split(' ')[1].Split('?')[1]);
          1
          2
          3
          

          顯然我們首先需要判斷請(qǐng)求類(lèi)型是否為GET以及請(qǐng)求中是否帶有參數(shù),其方法是判斷請(qǐng)求地址中是否含有“?”字符。這里的lines是指將報(bào)文信息按行分割以后的數(shù)組,顯然請(qǐng)求地址在第一行,所以我們根據(jù)“?”分割該行數(shù)據(jù)以后就可以得到“num1=23&num2=12”這樣的結(jié)果,這里我們使用一個(gè)方法GetRequestParms來(lái)返回參數(shù)字典,這樣作做是為了復(fù)用方法,因?yàn)樵谔幚鞵ost請(qǐng)求的時(shí)候我們會(huì)繼續(xù)使用這個(gè)方法。該方法定義如下:

           /// <summary>
          /// 從內(nèi)容中解析請(qǐng)求參數(shù)并返回一個(gè)字典
          /// </summary>
          /// <param name="content">使用&連接的參數(shù)字符串</param>
          /// <returns>如果存在參數(shù)則返回參數(shù)否則返回null</returns>
          protected Dictionary<string, string> GetRequestParams(string content)
          {
           //防御編程
           if(string.IsNullOrEmpty(content))
           return null;
           //按照&對(duì)字符進(jìn)行分割
           string[] reval=content.Split('&');
           if(reval.Length <=0)
           return null;
           //將結(jié)果添加至字典
           Dictionary<string, string> dict=new Dictionary<string, string>();
           foreach(string val in reval)
           {
           string[] kv=val.Split('=');
           if(kv.Length <=1)
           dict.Add(kv[0], "");
           dict.Add(kv[0],kv[1]);
           }
           //返回字典
           return dict;
          }
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          

          實(shí)現(xiàn)Post請(qǐng)求

          Post請(qǐng)求相對(duì)Get請(qǐng)求比較安全,因?yàn)樗朔薌et請(qǐng)求參數(shù)長(zhǎng)度的限制問(wèn)題,而且由于它的參數(shù)是存放在消息體中的,所以在傳遞參數(shù)的時(shí)候?qū)τ脩?hù)而言是不可見(jiàn)的,我們平時(shí)接觸到的網(wǎng)站登錄都是這種類(lèi)型,而復(fù)雜點(diǎn)的網(wǎng)站會(huì)通過(guò)驗(yàn)證碼、Cookie等形式來(lái)避免爬蟲(chóng)程序模擬登錄,在Web開(kāi)發(fā)中Post請(qǐng)求可以由一個(gè)表單發(fā)起,可以由爬蟲(chóng)程序如HttpWebRequest、WebClient等發(fā)起,下面我們重點(diǎn)來(lái)分析它的請(qǐng)求報(bào)文:

          POST / HTTP/1.1
          Accept: text/html, application/xhtml+xml, image/jxr, */*
          Accept-Language: zh-Hans-CN,zh-Hans;q=0.5
          User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2486.0 Safari/537.36 Edge/13.10586
          Accept-Encoding: gzip, deflate
          Host: localhost:4040
          Connection: Keep-Alive
          Cookie: _ga=GA1.1.1181222800.1463541781
          num1=23&num2=12
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          

          我們可以注意到此時(shí)請(qǐng)求行的請(qǐng)求方法變成了POST,而在報(bào)文結(jié)尾增加了一行內(nèi)容,我們稱(chēng)其為“消息體”,這是一個(gè)可選的內(nèi)容,請(qǐng)注意它前面有一個(gè)空行。所以,當(dāng)我們處理一個(gè)Posst請(qǐng)求的時(shí)候,通過(guò)最后一行就可以解析出客戶(hù)端傳遞過(guò)來(lái)的參數(shù),和Get請(qǐng)求相同,我們這里繼續(xù)使用GetRequestParams來(lái)完成解析。

          if(this.Method=="POST")
           this.Params=GetRequestParams(lines[lines.Length-1]);
          1
          2
          

          實(shí)例

          現(xiàn)在我們來(lái)完成一個(gè)簡(jiǎn)單地實(shí)例,服務(wù)器自然由我們這里設(shè)計(jì)的這個(gè)服務(wù)器來(lái)完成咯,而客戶(hù)端則由Unity來(lái)完成因?yàn)閁nity有簡(jiǎn)單的WWW可以使用。首先來(lái)編寫(xiě)服務(wù)端,這個(gè)繼承HttpServer就好了,我們主要來(lái)寫(xiě)這里的方法:

          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Text;
          using System.Threading.Tasks;
          using HttpServerLib;
          using System.IO;
          namespace HttpServer
          {
           public class ExampleServer : HttpServerLib.HttpServer
           {
           /// <summary>
           /// 構(gòu)造函數(shù)
           /// </summary>
           /// <param name="ipAddress">IP地址</param>
           /// <param name="port">端口號(hào)</param>
           public ExampleServer(string ipAddress, int port)
           : base(ipAddress, port)
           {
           }
           public override void OnPost(HttpRequest request)
           {
           //獲取客戶(hù)端傳遞的參數(shù)
           int num1=int.Parse(request.Params["num1"]);
           int num2=int.Parse(request.Params["num2"]);
           //設(shè)置返回信息
           string content=string.Format("這是通過(guò)Post方式返回的數(shù)據(jù):num1={0},num2={1}",num1,num2);
           //構(gòu)造響應(yīng)報(bào)文
           HttpResponse response=new HttpResponse(content, Encoding.UTF8);
           response.StatusCode="200";
           response.Content_Type="text/html; charset=UTF-8";
           response.Server="ExampleServer";
           //發(fā)送響應(yīng)
           ProcessResponse(request.Handler, response);
           }
           public override void OnGet(HttpRequest request)
           {
           //獲取客戶(hù)端傳遞的參數(shù)
           int num1=int.Parse(request.Params["num1"]);
           int num2=int.Parse(request.Params["num2"]);
           //設(shè)置返回信息
           string content=string.Format("這是通過(guò)Get方式返回的數(shù)據(jù):num1={0},num2={1}",num1,num2);
           //構(gòu)造響應(yīng)報(bào)文
           HttpResponse response=new HttpResponse(content, Encoding.UTF8);
           response.StatusCode="200";
           response.Content_Type="text/html; charset=UTF-8";
           response.Server="ExampleServer";
           //發(fā)送響應(yīng)
           ProcessResponse(request.Handler, response);
           }
           }
          }
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          36
          37
          38
          39
          40
          41
          42
          43
          44
          45
          46
          47
          48
          49
          50
          51
          52
          53
          54
          55
          56
          57
          58
          59
          60
          61
          62
          

          因?yàn)檫@里需要對(duì)Get和Post進(jìn)行響應(yīng),所以我們這里對(duì)OnGet和OnPost兩個(gè)方法進(jìn)行了重寫(xiě),這里的處理方式非常簡(jiǎn)單,按照一定格式返回?cái)?shù)據(jù)即可。下面我們來(lái)說(shuō)說(shuō)Unity作為客戶(hù)端這邊要做的工作。WWW是Unity3D中提供的一個(gè)簡(jiǎn)單的HTTP協(xié)議的封裝類(lèi),它和.NET平臺(tái)下的WebClient、HttpWebRequest/HttpWebResponse類(lèi)似,都可以處理常見(jiàn)的HTTP請(qǐng)求如Get和Post這兩種請(qǐng)求方式。

          WWW的優(yōu)勢(shì)主要是簡(jiǎn)單易用和支持協(xié)程,尤其是Unity3D中的協(xié)程(Coroutine)這個(gè)特性,如果能夠得到良好的使用,常常能夠起到事倍功半的效果。因?yàn)閃WW強(qiáng)調(diào)的是以HTTP短鏈接為主的易用性,所以相應(yīng)地在超時(shí)、Cookie等HTTP頭部字段支持的完整性上無(wú)法和WebClient、HttpWebRequest/HttpWebRespons相提并論,當(dāng)我們需要更復(fù)雜的HTTP協(xié)議支持的時(shí)候,選擇在WebClient、HttpWebRequest/HttpWebResponse上進(jìn)行深度定制將會(huì)是一個(gè)不錯(cuò)的選擇。我們這里需要的是發(fā)起一個(gè)簡(jiǎn)單的HTTP請(qǐng)求,所以使用WWW完全可以滿(mǎn)足我們的要求,首先我們來(lái)看在Unity3D中如何發(fā)起一個(gè)Get請(qǐng)求,這里給出一個(gè)簡(jiǎn)單的代碼示例:

          //采用GET方式請(qǐng)求數(shù)據(jù)
          IEnumerator Get()
          {
           WWW www=new WWW ("http://127.0.0.1:4040/?num1=12&num2=23");
           yield return www;
           Debug.Log(www.text);
          }
          1
          2
          3
          4
          5
          6
          7
          

          現(xiàn)在我們是需要使用StartCoroutine調(diào)用這個(gè)方法就可以啦!同樣地,對(duì)于Post請(qǐng)求,我們這里采用一個(gè)WWWForm來(lái)封裝參數(shù),而在網(wǎng)頁(yè)開(kāi)發(fā)中我們通常都是借助表單來(lái)向服務(wù)器傳遞參數(shù)的,這里給出同樣簡(jiǎn)單的代碼示例:

          //采用POST方式請(qǐng)求數(shù)據(jù)
          IEnumerator Post()
          {
           WWWForm form=new WWWForm ();
           form.AddField ("num1", 12);
           form.AddField ("num2", 23);
           WWW www=new WWW ("http://127.0.0.1:4040/", form);
           yield return www;
           Debug.Log (www.text);
          }
          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          

          而運(yùn)行這個(gè)實(shí)例,我們可以得到下面的結(jié)果:


          都是誰(shuí)告訴你做服務(wù)器開(kāi)發(fā)一定要用Java的啊,現(xiàn)在我們可以寫(xiě)出自己的服務(wù)器了,本篇結(jié)束

          訪(fǎng)問(wèn)中需要用到HTTPRequest組件,HTTPRequest發(fā)起HTTP請(qǐng)求,異步回調(diào)返回HTTPResponse。本篇就來(lái)給大家分享下在項(xiàng)目開(kāi)發(fā)中HTTP訪(fǎng)問(wèn)和下載的實(shí)現(xiàn)。

          發(fā)送Post表單

          在unity中,www類(lèi)雖然滿(mǎn)足了很多需求但也失去了一部分自由,下面我們用C#實(shí)現(xiàn)發(fā)送post請(qǐng)求,傳遞表單,并獲取或設(shè)置cookie。

          private IEnumerator Login(string _url)
                      {
                          //設(shè)置鏈接
                          Uri url=new Uri(_url);
                          //設(shè)置http請(qǐng)求
                          HttpWebRequest request=(HttpWebRequest)HttpWebRequest.Create(url);
                          request.Method="POST";
                          //表單數(shù)據(jù)
                          byte[] _data=Encoding.UTF8.GetBytes("account=" + "CarefreeQ" + "&password=" + "CarefreeQ");
                          //內(nèi)容類(lèi)型
                          request.ContentType="application/x-www-form-urlencoded";
                          //內(nèi)容長(zhǎng)度
                          request.ContentLength=_data.Length;
                          //設(shè)置cookie,如要獲取則不能為空
                          request.CookieContainer=new CookieContainer();
                          //創(chuàng)建流
                          Stream stream=request.GetRequestStream();
                          //寫(xiě)入數(shù)據(jù)
                          stream.Write(_data, 0, _data.Length);
                          stream.Close();
                          //開(kāi)始接收響應(yīng)
                          HttpWebResponse response=(HttpWebResponse)request.GetResponse();
                          //獲取cookie
                          string cookie=request.CookieContainer.GetCookieHeader(url);
                          //接收流
                          stream=response.GetResponseStream();
                          //內(nèi)容長(zhǎng)度
                          int max=(int)response.ContentLength;
                          int len=0;
                          //數(shù)據(jù)長(zhǎng)度
                          _data=new byte[max];
                          while (len < max)
                          {
                              //寫(xiě)入響應(yīng)數(shù)據(jù)
                              int _len=stream.Read(_data, len, _data.Length);
                              len +=_len;
                              yield return new WaitForEndOfFrame();
                          }
                          //讀取數(shù)據(jù)
                          string text=Encoding.UTF8.GetString(_data);
                      }
          

          下載文件到本地

          在Unity的開(kāi)發(fā)中,我們經(jīng)常會(huì)把資源保存到網(wǎng)上,比如一些網(wǎng)格,assetbundle,配置文件,貼圖等等。我們希望在用戶(hù)使用時(shí)下載到本地。

             privateIEnumeratorDownload(string_url)  
                {  
                  //設(shè)置保存路徑  
                  stringpath="自定義目錄";  
                  //這個(gè)方法可以新建一個(gè)線(xiàn)程運(yùn)行,來(lái)提高效率和降低卡頓,這里就不寫(xiě)了  
                  Uriurl=newUri(_url);  
                  //創(chuàng)建接受  
                  WebRequestrequest=WebRequest.Create(url);  
                  //以下為接收響應(yīng)的方法  
                  WebResponseresponse=request.GetResponse();  
                  //創(chuàng)建接收流  
                  Streamstream=response.GetResponseStream();  
                  //檢查目錄是否存在,不存在則創(chuàng)建  
                  stringdir=path.Substring(0,path.LastIndexOf("/"));  
                  if(!Directory.Exists(dir))  
                    Directory.CreateDirectory(dir);  
                  //文件寫(xiě)入路徑  
                  FileStreamfile=newFileStream(path,FileMode.OpenOrCreate,FileAccess.Write);  
                  //返回內(nèi)容總長(zhǎng)度  
                  intmax=(int)response.ContentLength;  
                  intlen=0;  
                  while(len<max)  
                  {  
                    //byte容器  
                    byte[]data=newbyte[10240000];  
                    //循環(huán)讀取  
                    int_len=stream.Read(data,0,data.Length);  
                    //寫(xiě)入文件  
                    file.Write(data,0,_len);  
                    len+=_len;  
                    //如果需要傳遞進(jìn)度,可以這樣算  
                    //floatprogress=len/(float)max;  
                    yieldreturnnewWaitForEndOfFrame();  
                  }  
                  //寫(xiě)入完后關(guān)閉文件流和接收流  
                  file.Close();  
                  stream.Close();  
                }
          

          最后,以上就是給大家分享的關(guān)于HTTP訪(fǎng)問(wèn)和下載實(shí)現(xiàn),希望能對(duì)大家有所幫助。

          GDC 2019大會(huì)上,Unity的Demo小組展示了一段名為“異教徒”的小短片。這是一段使用Unity引擎實(shí)時(shí)演算的技術(shù)demo,游戲的畫(huà)面逼真得讓人難以置信。值得一提的是,這個(gè)demo是在家用消費(fèi)級(jí)的臺(tái)式機(jī)PC上運(yùn)行的,游戲的畫(huà)面為1440P/30幀,好了,讓我們一起來(lái)看看吧!

          這段“異教徒”技術(shù)demo演示是用最新版Unity引擎的“post-processing(后處理)”功能制作的,使用這一功能,Unity引擎為demo畫(huà)面加上了動(dòng)態(tài)模糊、高光、景深、膠片顆粒、色彩分級(jí)等畫(huà)面特效。實(shí)現(xiàn)了無(wú)比逼真的畫(huà)面效果。

          這段技術(shù)Demo中的光線(xiàn)效果全部都是實(shí)時(shí)演算的,它使用了移動(dòng)檢測(cè)技術(shù)的光線(xiàn)解決方案。Demo最終呈現(xiàn)出來(lái)畫(huà)面讓人驚訝,而Unity也承諾不久之后就會(huì)放出完整版的短片。

          視頻截圖:


          主站蜘蛛池模板: 极品尤物一区二区三区| 97久久精品午夜一区二区 | 亚洲第一区精品观看| 国模私拍一区二区三区| 正在播放国产一区| 亚洲一区二区三区免费在线观看| 国产精品毛片一区二区| 相泽南亚洲一区二区在线播放| 久久久久人妻精品一区二区三区 | 日本精品一区二区三区视频| 日本不卡一区二区视频a| 色噜噜AV亚洲色一区二区| 久久精品国产一区二区三区| 日韩精品一区二区三区老鸦窝| 最新欧美精品一区二区三区| 亚洲国产一区国产亚洲| 国产AV一区二区三区无码野战 | 国产欧美一区二区精品仙草咪| 91精品一区二区| 亚洲国产精品一区二区三区在线观看| 一区二区视频在线播放| 性无码免费一区二区三区在线 | 久久影院亚洲一区| 精品国产一区二区三区AV性色| 精品在线视频一区| 国产福利电影一区二区三区久久久久成人精品综合 | 国产在线观看一区二区三区| 无码丰满熟妇一区二区| 国产乱码精品一区二区三区麻豆| 中文字幕AV无码一区二区三区| 亚洲视频一区二区在线观看| 亚洲一区免费视频| 日本高清一区二区三区| 日本免费一区尤物| 视频一区在线免费观看| 国产无码一区二区在线| 日韩免费视频一区二区| av无码免费一区二区三区| 大香伊蕉日本一区二区| 国产在线一区二区在线视频| 亚洲一区二区三区日本久久九|