<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

          本文主要從實踐角度介紹長、短連接在TCP層面的表現,借助Node.JS搭建后臺服務,使用WinHTTP、Ajax做客戶端請求測試,最后簡單涉及WebSocket。

          關鍵字:長連接、短連接、Node.JS、WebSocket.

          一兩年前,在理論上對長短連接做了學習,那時的技能以客戶端為主,所以也止步于客戶端和網絡抓包,兩年來后臺技術漸有把握,打算從前到后的實踐一遍。如對理論有不理解的,可以先google/百度 一下,或者看看這篇偏理論的介紹:HTTP的長連接和短連接

      1 短連接的表現

      先寫個簡單的server看看短鏈接的效果,在8124端口上創建WEB服務,給客戶端返回Hello World\n,然后斷開連接,代碼:
      /**                                                                                                                                                                                         
       *  * @file 短連接測試服務
       *  *  啟動: node short.js
       *  * @authoer cswuyg
       *   */
      var os = require('os');
      var http = require('http');
      
      var server = http.createServer(function(req, res) {
          console.log(req.connection.remoteAddress + ':' + req.connection.remotePort);
          res.writeHead(200, {'Content-Type': 'text/plain'});
          res.end('Hello World\n');
          res.destroy();  // destroy immediately
      }).listen(8124);
      
      console.log('start ' + os.hostname() + ':8124');

      在瀏覽器訪問:http://hostname:8124

      使用WireShark抓包:

       
      注意到了嗎?上面的FIN 是由8124端口,也就是我們的WEB服務發出來的,及時的銷毀了連接。多次刷新瀏覽器頁面,每次都是不同的客戶端端口發起請求,不會復用舊連接。

      2 長連接的表現

      (1)WEB服務代碼:
      /**                                                                                                                                                                                                               
       *  * @file 長連接測試服務器
       *  * 啟動: node persistent.js
       *  * ./a.html 為同目錄下的ajax請求測試文件
       *  * @authoer cswuyg
       *   */
      var os = require('os');
      var http = require('http');
      var fs = require('fs');
      
      var server = http.createServer(function(req, res) {
          if (/^\/a.html/.test(req.url)) {
              fs.createReadStream('a.html').pipe(res);
          } else {
              console.log(req.connection.remoteAddress + ':' + req.connection.remotePort);
              res.writeHead(200, {'Content-Type': 'text/plain'});
              res.end('Hello World\n');
          }
      }).listen(8124);
      server.setTimeout(0);   //設置不超時,所以服務端不會主動關閉連接
      
      console.log('start ' + os.hostname() + ':8124');
      (2)使用WinHTTP測試:
      如果我們使用WinHTTP去獲取數據,在這份代碼上做修改:https://github.com/cswuyg/win_net/blob/master/winhttp_get_file/winhttp_get_test/http_get/http_get.cpp
      代碼節選:
      xx:
          const wchar_t* lpszAcceptedType[] = {L"*/*", NULL};
          request_handle_ = ::WinHttpOpenRequest(connect_handle, L"GET", url_path_.c_str(), L"HTTP/1.1", WINHTTP_NO_REFERER, lpszAcceptedType, 0);
          if (request_handle_ == NULL)
          {
              return FALSE;
          }
          DWORD time_out = 5000;
          ::WinHttpSetOption(request_handle_, WINHTTP_OPTION_CONNECT_TIMEOUT, &time_out, sizeof(DWORD));
          ::WinHttpSendRequest(request_handle_, WINHTTP_NO_ADDITIONAL_HEADERS, 0, WINHTTP_NO_REQUEST_DATA, 0, 0, 0);
          ::WinHttpReceiveResponse(request_handle_, NULL);
          Recv();
      goto xx;  //測試代碼,不懼goto~
      代碼思路就是connect handle打開之后,后面不同url的請求(當然是同域名下的)可以復用這個connect handle。

      使用WireShark抓包,效果:

      注:WinHTTP connect handle復用這是瀏覽器開發者的事情,WEB開發者不會關心到它。

      (3)如果我們使用js代碼來測試長連接效果呢?
      使用ajax,
      a.html:
      <script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
      <script>     
       
      function callNode() {
          $.ajax({ 
              cache : false,
              url : 'http://xxxxxyouhost:8124',
              data : {},
              success : function(response, code, xhr) {
                  console.log(response);
                  console.log(code);                                                                                                                                                                                    
                  callNode();
              }    
          });      
      };           
      callNode();  
      </script>    
      在瀏覽器訪問:http://hostname:8124/a.html
      后臺上看效果:
       
      刷刷刷的顯示出客戶端的多次請求都是一樣的IP和端口。

      3、WebSocket

      從WEB開發者最直接的感受來說,終于,可以不用輪詢了,只需要使用WebSocket就可以實現全雙工通信,要給客戶端推送數據更方便了。
      從HTTP優化的角度來說:短連接發展到長連接,省略了重復的三次握手,WebSocket的出現,則把HTTP HEADER也省略掉了。而WebSocket,它不是HTTP協議。
       
      WebSocket在底層的表現就是保持連接不斷開,客戶端既能接收數據也能發送數據,服務端既能接收數據也能發送數據。這在socket層面并沒有什么特別,socket的接收緩存區和發送緩存區是分開的,既可以接收也可以發送。對于從socket層面寫服務和應用的人來說,WebSocket并不稀奇,譬如,寫一個聊天室,連接可以一直不斷開的發送和接收數據。對于做WEB開發的朋友,則有很大不同,之前HTTP請求,每一次傳輸數據,不管是不是用了長連接都是需要有頭部信息,而現在有了WebSocket,一個連接可以一直保持著,不發出FIN包,可以收發數據,是長連接,且多次請求不需要有多個頭部信息。(一般的http請求,5分鐘無響應后,chrome瀏覽器主動斷開連接),
       
      每一次HTTP請求都要走一遍完整的HTTP協議,這讓那些需要實時傳輸數據的朋友很辛苦,雖然HTTP1.1帶來了長連接,不用每一次都重新三次握手建立連接,省略了握手的浪費,但是長連接里每一次請求的的HTTP頭都是一樣的,也還是很浪費,要把長連接里的多次請求的HTTP頭也消滅掉,消滅掉之后的協議叫做WebSocket,這個名字也很寫實,就像是把Socket層面的東西暴露給上層應用了。
       
      瀏覽器為了支持WebSocket,可能會做哪些事情呢? 1是去掉超時關閉連接,這種協議就不用主動關閉了;2給后端發數據時,非首次請求不發出HTTP HEADER,后面的多次數據傳輸都不用再起HTTP連接了;3可以隨時接收發送數據,之前都是需要客戶端發起請求,然后服務端回應這樣的模式來傳輸數據。 另外,還會做校驗、編碼之類的工作。
      在做實際開發的時候,有瀏覽器支持還不夠,后臺也需要支持,Node上有socket.io模塊可用。
      在使用WebSocket的時候,要注意,后臺可能經過一個個的代理,代理可能不認識WebSocket協議,可能會有超時斷開連接的邏輯,這會導致長連接無法保持。 
      使用WebSocket協議做聊天室,抓包:
      說明:1、WebSocket借助了HTTP協議;2、這個tcp stream不會終止,它的傳輸內容會隨著客戶端跟服務端的通信而增長。
       
       WebSocket連接建立時的抓包:
       
       
       從HTTP1.0、長連接、WebSocket的發展,是不是可以看出:從無狀態發展到有狀態?無狀態在做分布式/高并發的時候相當重要,但在明明就是有狀態的場景下強制使用無狀態就壞事了。
       
      文中所涉及Node和html代碼見github:http_persistent_connection.
      如有錯誤請指正.
       
      學習參考:http://www.plhwin.com/2014/05/28/nodejs-socketio/
       
      posted on 2016-01-05 22:10  -銀光-  閱讀(19447)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 高清国产av一区二区三区| 日韩本精品一区二区三区| 亚洲中文字幕在线精品一区| 92自拍视频爽啪在线观看| 女人被爽到高潮视频免费国产| 国产成人综合网亚洲第一| 厨房与子乱在线观看| 在线精品自拍亚洲第一区| 中文字幕人成乱码熟女| 国产成人永久免费av在线| 国产麻豆成人传媒免费观看| 久久一区二区中文字幕| 国产成人精品亚洲午夜| 国内精品视频一区二区三区| 日本在线 | 中文| 国产成人免费一区二区三区| 正在播放肥臀熟妇在线视频| 上司人妻互换中文字幕| 亚洲精品国产男人的天堂| 少妇人妻偷人精品系列| 日本高清视频色欧WWW| 黄又色又污又爽又高潮| 亚洲三级香港三级久久| 国产无遮挡免费真人视频在线观看| 镇安县| 国产午夜亚洲精品福利| 国产成人高清亚洲综合| 亚洲av本道一区二区| 国产成人免费ā片在线观看| 亚洲а∨天堂久久精品2021| 亚洲老熟女乱女一区二区| 国产国拍亚洲精品永久软件| 亚洲蜜臀av乱码久久| 伊人色综合久久天天| 国产极品粉嫩尤物一区二区| 国产精品天天在线午夜更新 | 亚洲性日韩精品一区二区| 国内熟妇人妻色在线三级| 日韩有码国产精品一区| 91中文字幕一区在线| 精品久久亚洲中文无码|