隨筆-57  評(píng)論-117  文章-1  trackbacks-0

          基于HTTP的長(zhǎng)連接,是一種通過長(zhǎng)輪詢方式實(shí)現(xiàn)"服務(wù)器推"的技術(shù),它彌補(bǔ)了HTTP簡(jiǎn)單的請(qǐng)求應(yīng)答模式的不足,極大地增強(qiáng)了程序的實(shí)時(shí)性和交互性。

           

          一、什么是長(zhǎng)連接、長(zhǎng)輪詢?

          用通俗易懂的話來(lái)說(shuō),就是客戶端不停的向服務(wù)器發(fā)送請(qǐng)求以獲取最新的數(shù)據(jù)信息。這里的“不?!逼鋵?shí)是有停止的,只是我們?nèi)搜蹮o(wú)法分辨是否停止,它只是一種快速的停下然后又立即開始連接而已。

           

          二、長(zhǎng)連接、長(zhǎng)輪詢的應(yīng)用場(chǎng)景

          長(zhǎng)連接、長(zhǎng)輪詢一般應(yīng)用與WebIM、ChatRoom和一些需要及時(shí)交互的網(wǎng)站應(yīng)用中。其真實(shí)案例有:WebQQ、Hi網(wǎng)頁(yè)版、Facebook IM等。

          如果你對(duì)服務(wù)器端的反向Ajax感興趣,可以參考這篇文章 DWR 反向Ajax 服務(wù)器端推的方式:http://www.cnblogs.com/hoojo/category/276235.html

          歡迎大家繼續(xù)支持和關(guān)注我的博客:

          http://hoojo.cnblogs.com

          http://blog.csdn.net/IBM_hoojo

          也歡迎大家和我交流、探討IT方面的知識(shí)。

          email:hoojo_@126.com

           

          三、優(yōu)缺點(diǎn)

          輪詢:客戶端定時(shí)向服務(wù)器發(fā)送Ajax請(qǐng)求,服務(wù)器接到請(qǐng)求后馬上返回響應(yīng)信息并關(guān)閉連接。
          優(yōu)點(diǎn):后端程序編寫比較容易。
          缺點(diǎn):請(qǐng)求中有大半是無(wú)用,浪費(fèi)帶寬和服務(wù)器資源。
          實(shí)例:適于小型應(yīng)用。


          長(zhǎng)輪詢:客戶端向服務(wù)器發(fā)送Ajax請(qǐng)求,服務(wù)器接到請(qǐng)求后hold住連接,直到有新消息才返回響應(yīng)信息并關(guān)閉連接,客戶端處理完響應(yīng)信息后再向服務(wù)器發(fā)送新的請(qǐng)求。
          優(yōu)點(diǎn):在無(wú)消息的情況下不會(huì)頻繁的請(qǐng)求,耗費(fèi)資源小。
          缺點(diǎn):服務(wù)器hold連接會(huì)消耗資源,返回?cái)?shù)據(jù)順序無(wú)保證,難于管理維護(hù)。
          實(shí)例:WebQQ、Hi網(wǎng)頁(yè)版、Facebook IM。

          長(zhǎng)連接:在頁(yè)面里嵌入一個(gè)隱蔵iframe,將這個(gè)隱蔵iframe的src屬性設(shè)為對(duì)一個(gè)長(zhǎng)連接的請(qǐng)求或是采用xhr請(qǐng)求,服務(wù)器端就能源源不斷地往客戶端輸入數(shù)據(jù)。
          優(yōu)點(diǎn):消息即時(shí)到達(dá),不發(fā)無(wú)用請(qǐng)求;管理起來(lái)也相對(duì)方便。
          缺點(diǎn):服務(wù)器維護(hù)一個(gè)長(zhǎng)連接會(huì)增加開銷。
          實(shí)例:Gmail聊天


          Flash Socket:在頁(yè)面中內(nèi)嵌入一個(gè)使用了Socket類的 Flash 程序JavaScript通過調(diào)用此Flash程序提供的Socket接口與服務(wù)器端的Socket接口進(jìn)行通信,JavaScript在收到服務(wù)器端傳送的信息后控制頁(yè)面的顯示。
          優(yōu)點(diǎn):實(shí)現(xiàn)真正的即時(shí)通信,而不是偽即時(shí)。
          缺點(diǎn):客戶端必須安裝Flash插件;非HTTP協(xié)議,無(wú)法自動(dòng)穿越防火墻。
          實(shí)例:網(wǎng)絡(luò)互動(dòng)游戲。

           

          四、實(shí)現(xiàn)原理

          所謂長(zhǎng)連接,就是要在客戶端與服務(wù)器之間創(chuàng)建和保持穩(wěn)定可靠的連接。其實(shí)它是一種很早就存在的技術(shù),但是由于瀏覽器技術(shù)的發(fā)展比較緩慢,沒有為這種機(jī)制的實(shí)現(xiàn)提供很好的支持。所以要達(dá)到這種效果,需要客戶端和服務(wù)器的程序共同配合來(lái)完成。通常的做法是,在服務(wù)器的程序中加入一個(gè)死循環(huán),在循環(huán)中監(jiān)測(cè)數(shù)據(jù)的變動(dòng)。當(dāng)發(fā)現(xiàn)新數(shù)據(jù)時(shí),立即將其輸出給瀏覽器并斷開連接,瀏覽器在收到數(shù)據(jù)后,再次發(fā)起請(qǐng)求以進(jìn)入下一個(gè)周期,這就是常說(shuō)的長(zhǎng)輪詢(long-polling)方式。如下圖所示,它通常包含以下幾個(gè)關(guān)鍵過程:

          image

          1. 輪詢的建立
          建立輪詢的過程很簡(jiǎn)單,瀏覽器發(fā)起請(qǐng)求后進(jìn)入循環(huán)等待狀態(tài),此時(shí)由于服務(wù)器還未做出應(yīng)答,所以HTTP也一直處于連接狀態(tài)中。
          2. 數(shù)據(jù)的推送
          在循環(huán)過程中,服務(wù)器程序?qū)?shù)據(jù)變動(dòng)進(jìn)行監(jiān)控,如發(fā)現(xiàn)更新,將該信息輸出給瀏覽器,隨即斷開連接,完成應(yīng)答過程,實(shí)現(xiàn)“服務(wù)器推”。
          3. 輪詢的終止
          輪詢可能在以下3種情況時(shí)終止:
            3.1. 有新數(shù)據(jù)推送
             當(dāng)循環(huán)過程中服務(wù)器向?yàn)g覽器推送信息后,應(yīng)該主動(dòng)結(jié)束程序運(yùn)行從而讓連接斷開,這樣瀏覽器才能及時(shí)收到數(shù)據(jù)。
            3.2. 沒有新數(shù)據(jù)推送
             循環(huán)不能一直持續(xù)下去,應(yīng)該設(shè)定一個(gè)最長(zhǎng)時(shí)限,避免WEB服務(wù)器超時(shí)(Timeout),若一直沒有新信息,服務(wù)器應(yīng)主動(dòng)向?yàn)g覽器發(fā)送本次輪詢無(wú)新信息的正常響應(yīng),并斷開連接,這也被稱為“心跳”信息。
            3.3. 網(wǎng)絡(luò)故障或異常
             由于網(wǎng)絡(luò)故障等因素造成的請(qǐng)求超時(shí)或出錯(cuò)也可能導(dǎo)致輪詢的意外中斷,此時(shí)瀏覽器將收到錯(cuò)誤信息。
          4. 輪詢的重建
          瀏覽器收到回復(fù)并進(jìn)行相應(yīng)處理后,應(yīng)馬上重新發(fā)起請(qǐng)求,開始一個(gè)新的輪詢周期。

           

          五、程序設(shè)計(jì)

          1、普通輪詢 Ajax方式

          客戶端代碼片段

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
              <head>
                  <meta http-equiv="pragma" content="no-cache">
                  <meta http-equiv="cache-control" content="no-cache">
                  <meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com">
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                  <%@ include file="/tags/jquery-lib.jsp"%>
                  
                  <script type="text/javascript">
                      $(function () {
                      
                          window.setInterval(function () {
                          
                              $.get("${pageContext.request.contextPath}/communication/user/ajax.mvc", 
                                  {"timed": new Date().getTime()}, 
                                  function (data) {
                                      $("#logs").append("[data: " + data + " ]<br/>");
                              });
                          }, 3000);
                          
                      });
                  </script>
              </head>
              
              <body>
                  <div id="logs"></div>
              </body>
          </html>

          客戶端實(shí)現(xiàn)的就是用一種普通輪詢的結(jié)果,比較簡(jiǎn)單。利用setInterval不間斷的刷新來(lái)獲取服務(wù)器的資源,這種方式的優(yōu)點(diǎn)就是簡(jiǎn)單、及時(shí)。缺點(diǎn)是鏈接多數(shù)是無(wú)效重復(fù)的;響應(yīng)的結(jié)果沒有順序(因?yàn)槭钱惒秸?qǐng)求,當(dāng)發(fā)送的請(qǐng)求沒有返回結(jié)果的時(shí)候,后面的請(qǐng)求又被發(fā)送。而此時(shí)如果后面的請(qǐng)求比前面的請(qǐng)求要先返回結(jié)果,那么當(dāng)前面的請(qǐng)求返回結(jié)果數(shù)據(jù)時(shí)已經(jīng)是過時(shí)無(wú)效的數(shù)據(jù)了);請(qǐng)求多,難于維護(hù)、浪費(fèi)服務(wù)器和網(wǎng)絡(luò)資源。

          服務(wù)器端代碼

          @RequestMapping("/ajax")
          public void ajax(long timed, HttpServletResponse response) throws Exception {
               PrintWriter writer = response.getWriter();
               
               Random rand = new Random();
               // 死循環(huán) 查詢有無(wú)數(shù)據(jù)變化
               while (true) {
                   Thread.sleep(300); // 休眠300毫秒,模擬處理業(yè)務(wù)等
                   int i = rand.nextInt(100); // 產(chǎn)生一個(gè)0-100之間的隨機(jī)數(shù)
                   if (i > 20 && i < 56) { // 如果隨機(jī)數(shù)在20-56之間就視為有效數(shù)據(jù),模擬數(shù)據(jù)發(fā)生變化
                       long responseTime = System.currentTimeMillis();
                       // 返回?cái)?shù)據(jù)信息,請(qǐng)求時(shí)間、返回?cái)?shù)據(jù)時(shí)間、耗時(shí)
                       writer.print("result: " + i + ", response time: " + responseTime + ", request time: " + timed + ", use time: " + (responseTime - timed));
                       break; // 跳出循環(huán),返回?cái)?shù)據(jù)
                   } else { // 模擬沒有數(shù)據(jù)變化,將休眠 hold住連接
                       Thread.sleep(1300);
                   }
               }
               
          }

          服務(wù)器端實(shí)現(xiàn),這里就模擬下程序監(jiān)控?cái)?shù)據(jù)的變化。上面代碼屬于SpringMVC 中controller中的一個(gè)方法,相當(dāng)于Servlet中的一個(gè)doPost/doGet方法。如果沒有程序環(huán)境適應(yīng)servlet即可,將方法體中的代碼copy到servlet的doGet/doPost中即可。

          服務(wù)器端在進(jìn)行長(zhǎng)連接的程序設(shè)計(jì)時(shí),要注意以下幾點(diǎn):
          1. 服務(wù)器程序?qū)喸兊目煽匦?/strong>
          由于輪詢是用死循環(huán)的方式實(shí)現(xiàn)的,所以在算法上要保證程序?qū)螘r(shí)退出循環(huán)有完全的控制能力,避免進(jìn)入死循環(huán)而耗盡服務(wù)器資源。
          2. 合理選擇“心跳”頻率
          從圖1可以看出,長(zhǎng)連接必須由客戶端不停地進(jìn)行請(qǐng)求來(lái)維持,所以在客戶端和服務(wù)器間保持正常的“心跳”至為關(guān)鍵,參數(shù)POLLING_LIFE應(yīng)小于WEB服務(wù)器的超時(shí)時(shí)間,一般建議在10~20秒左右。
          3. 網(wǎng)絡(luò)因素的影響
          在實(shí)際應(yīng)用時(shí),從服務(wù)器做出應(yīng)答,到下一次循環(huán)的建立,是有時(shí)間延遲的,延遲時(shí)間的長(zhǎng)短受網(wǎng)絡(luò)傳輸?shù)榷喾N因素影響,在這段時(shí)間內(nèi),長(zhǎng)連接處于暫時(shí)斷開的空檔,如果恰好有數(shù)據(jù)在這段時(shí)間內(nèi)發(fā)生變動(dòng),服務(wù)器是無(wú)法立即進(jìn)行推送的,所以,在算法設(shè)計(jì)上要注意解決由于延遲可能造成的數(shù)據(jù)丟失問題。
          4. 服務(wù)器的性能
          在長(zhǎng)連接應(yīng)用中,服務(wù)器與每個(gè)客戶端實(shí)例都保持一個(gè)持久的連接,這將消耗大量服務(wù)器資源,特別是在一些大型應(yīng)用系統(tǒng)中更是如此,大量并發(fā)的長(zhǎng)連接有可能導(dǎo)致新的請(qǐng)求被阻塞甚至系統(tǒng)崩潰,所以,在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)特別注意算法的優(yōu)化和改進(jìn),必要時(shí)還需要考慮服務(wù)器的負(fù)載均衡和集群技術(shù)。

          image

          上圖是返回的結(jié)果,可以看到先發(fā)出請(qǐng)求,不一定會(huì)最先返回結(jié)果。這樣就不能保證順序,造成臟數(shù)據(jù)或無(wú)用的連接請(qǐng)求??梢妼?duì)服務(wù)器或網(wǎng)絡(luò)的資源浪費(fèi)。

          2、普通輪詢 iframe方式

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
              <head>
                  <meta http-equiv="pragma" content="no-cache">
                  <meta http-equiv="cache-control" content="no-cache">
                  <meta http-equiv="expires" content="0">
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                  <%@ include file="/tags/jquery-lib.jsp"%>
                  
                  <script type="text/javascript">
                      $(function () {
                      
                          window.setInterval(function () {
                              $("#logs").append("[data: " + $($("#frame").get(0).contentDocument).find("body").text() + " ]<br/>");
                              $("#frame").attr("src", "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime());
                              // 延遲1秒再重新請(qǐng)求
                              window.setTimeout(function () {
                                  window.frames["polling"].location.reload();
                              }, 1000);
                          }, 5000);
                          
                      });
                  </script>
              </head>
              
              <body>
                  <iframe id="frame" name="polling" style="display: none;"></iframe>
                  <div id="logs"></div>
              </body>
          </html>

          這里的客戶端程序是利用隱藏的iframe向服務(wù)器端不停的拉取數(shù)據(jù),將iframe獲取后的數(shù)據(jù)填充到頁(yè)面中即可。同ajax實(shí)現(xiàn)的基本原理一樣,唯一不同的是當(dāng)一個(gè)請(qǐng)求沒有響應(yīng)返回?cái)?shù)據(jù)的情況下,下一個(gè)請(qǐng)求也將開始,這時(shí)候前面的請(qǐng)求將被停止。如果要使程序和上面的ajax請(qǐng)求一樣也可以辦到,那就是給每個(gè)請(qǐng)求分配一個(gè)獨(dú)立的iframe即可。下面是返回的結(jié)果:

          image

          其中紅色是沒有成功返回請(qǐng)求就被停止(后面請(qǐng)求開始)掉的請(qǐng)求,黑色是成功返回?cái)?shù)據(jù)的請(qǐng)求。

          3、長(zhǎng)連接iframe方式

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
              <head>
                  <meta http-equiv="pragma" content="no-cache">
                  <meta http-equiv="cache-control" content="no-cache">
                  <meta http-equiv="author" content="hoojo & http://hoojo.cnblogs.com">
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                  <%@ include file="/tags/jquery-lib.jsp"%>
                  
                  <script type="text/javascript">
                      $(function () {
                      
                          window.setInterval(function () {
                              var url = "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime();
                              var $iframe = $('<iframe id="frame" name="polling" style="display: none;" src="' + url + '"></iframe>');
                              $("body").append($iframe);
                          
                              $iframe.load(function () {
                                  $("#logs").append("[data: " + $($iframe.get(0).contentDocument).find("body").text() + " ]<br/>");
                                  $iframe.remove();
                              });
                          }, 5000);
                          
                      });
                  </script>
              </head>
              
              <body>
                  
                  <div id="logs"></div>
              </body>
          </html>

          這個(gè)輪詢方式就是把剛才上面的稍微改下,每個(gè)請(qǐng)求都有自己獨(dú)立的一個(gè)iframe,當(dāng)這個(gè)iframe得到響應(yīng)的數(shù)據(jù)后就把數(shù)據(jù)push到當(dāng)前頁(yè)面上。使用此方法已經(jīng)類似于ajax的異步交互了,這種方法也是不能保證順序的、比較耗費(fèi)資源、而且總是有一個(gè)加載的條在地址欄或狀態(tài)欄附件(當(dāng)然要解決可以利用htmlfile,Google的攻城師們已經(jīng)做到了,網(wǎng)上也有封裝好的lib庫(kù)),但客戶端實(shí)現(xiàn)起來(lái)比較簡(jiǎn)單。

          image

          如果要保證有序,可以不使用setInterval,將創(chuàng)建iframe的方法放在load事件中即可,即使用遞歸方式。調(diào)整后的代碼片段如下:

          <script type="text/javascript">
              $(function () {
                  (function iframePolling() {
                      var url = "${pageContext.request.contextPath}/communication/user/ajax.mvc?timed=" + new Date().getTime();
                      var $iframe = $('<iframe id="frame" name="polling" style="display: none;" src="' + url + '"></iframe>');
                      $("body").append($iframe);
                  
                      $iframe.load(function () {
                          $("#logs").append("[data: " + $($iframe.get(0).contentDocument).find("body").text() + " ]<br/>");
                          $iframe.remove();
                          
                          // 遞歸
                          iframePolling();
                      });
                  })();    
              });
          </script>

          這種方式雖然保證了請(qǐng)求的順序,但是它不會(huì)處理請(qǐng)求延時(shí)的錯(cuò)誤或是說(shuō)很長(zhǎng)時(shí)間沒有返回結(jié)果的請(qǐng)求,它會(huì)一直等到返回請(qǐng)求后才能創(chuàng)建下一個(gè)iframe請(qǐng)求,總會(huì)和服務(wù)器保持一個(gè)連接。和以上輪詢比較,缺點(diǎn)就是消息不及時(shí),但保證了請(qǐng)求的順序。

          4、ajax實(shí)現(xiàn)長(zhǎng)連接

          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isELIgnored="false" %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
              <head>
                  <meta http-equiv="pragma" content="no-cache">
                  <meta http-equiv="cache-control" content="no-cache">
                  <meta http-equiv="expires" content="0">
                  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                  <%@ include file="/tags/jquery-lib.jsp"%>
                  
                  <script type="text/javascript">
                      $(function () {
                      
                          (function longPolling() {
                          
                              $.ajax({
                                  url: "${pageContext.request.contextPath}/communication/user/ajax.mvc",
                                  data: {"timed": new Date().getTime()},
                                  dataType: "text",
                                  timeout: 5000,
                                  error: function (XMLHttpRequest, textStatus, errorThrown) {
                                      $("#state").append("[state: " + textStatus + ", error: " + errorThrown + " ]<br/>");
                                      if (textStatus == "timeout") { // 請(qǐng)求超時(shí)
                                              longPolling(); // 遞歸調(diào)用
                                          
                                          // 其他錯(cuò)誤,如網(wǎng)絡(luò)錯(cuò)誤等
                                          } else { 
                                              longPolling();
                                          }
                                      },
                                  success: function (data, textStatus) {
                                      $("#state").append("[state: " + textStatus + ", data: { " + data + "} ]<br/>");
                                      
                                      if (textStatus == "success") { // 請(qǐng)求成功
                                          longPolling();
                                      }
                                  }
                              });
                          })();
                          
                      });
                  </script>
              </head>
              
              <body>

          上面這段代碼就是才有Ajax的方式完成長(zhǎng)連接,主要優(yōu)點(diǎn)就是和服務(wù)器始終保持一個(gè)連接。如果當(dāng)前連接請(qǐng)求成功后,將更新數(shù)據(jù)并且繼續(xù)創(chuàng)建一個(gè)新的連接和服務(wù)器保持聯(lián)系。如果連接超時(shí)或發(fā)生異常,這個(gè)時(shí)候程序也會(huì)創(chuàng)建一個(gè)新連接繼續(xù)請(qǐng)求。這樣就大大節(jié)省了服務(wù)器和網(wǎng)絡(luò)資源,提高了程序的性能,從而也保證了程序的順序。

          image

           

          六、總結(jié)

          現(xiàn)代的瀏覽器都支持跨域資源共享(Cross-Origin Resource Share,CORS)規(guī)范,該規(guī)范允許XHR執(zhí)行跨域請(qǐng)求,因此基于腳本的和基于iframe的技術(shù)已成為了一種過時(shí)的需要。

          把Comet做為反向Ajax的實(shí)現(xiàn)和使用的最好方式是通過XMLHttpRequest對(duì)象,該做法提供了一個(gè)真正的連接句柄和錯(cuò)誤處理。當(dāng)然你選擇經(jīng)由HTTP長(zhǎng)輪詢使用XMLHttpRequest對(duì)象(在服務(wù)器端掛起的一個(gè)簡(jiǎn)單的Ajax請(qǐng)求)的Comet模式,所有支持Ajax的瀏覽器也都支持該種做法。

          基于HTTP的長(zhǎng)連接技術(shù),是目前在純?yōu)g覽器環(huán)境下進(jìn)行即時(shí)交互類應(yīng)用開發(fā)的理想選擇,隨著瀏覽器的快速發(fā)展,html5將為其提供更好的支持和更廣泛的應(yīng)用。在html5中有一個(gè)websocket 可以很友好的完成長(zhǎng)連接這一技術(shù),網(wǎng)上也有相關(guān)方面的資料,這里也就不再做過多介紹。



          作者:hoojo
          出處:
          blog:http://blog.csdn.net/IBM_hoojo
                   http://hoojo.cnblogs.com
          本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁(yè)面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。


          版權(quán)所有,轉(zhuǎn)載請(qǐng)注明出處 本文出自:
          分享道版權(quán)所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處,謝謝

          評(píng)論:
          # re: Web 通信 之 長(zhǎng)連接、長(zhǎng)輪詢(long polling) 2013-10-11 13:34 | tt
          還是websocket好用  回復(fù)  更多評(píng)論
            
          # re: Web 通信 之 長(zhǎng)連接、長(zhǎng)輪詢(long polling)[未登錄] 2013-11-05 19:36 | 黃土高坡
          “長(zhǎng)連接:在頁(yè)面里嵌入一個(gè)隱蔵iframe,將這個(gè)隱蔵iframe的src屬性設(shè)為對(duì)一個(gè)長(zhǎng)連接的請(qǐng)求或是采用xhr請(qǐng)求,服務(wù)器端就能源源不斷地往客戶端輸入數(shù)據(jù)” 這句話中“設(shè)為對(duì)一個(gè)長(zhǎng)連接的請(qǐng)求”這里的長(zhǎng)連接怎么實(shí)現(xiàn)的?是不是就是長(zhǎng)輪詢?  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 正阳县| 寿光市| 葫芦岛市| 宣城市| 南郑县| 合川市| 永泰县| 盐边县| 吴忠市| 昌邑市| 揭西县| 南投县| 阆中市| 永善县| 建水县| 德格县| 鹤庆县| 合川市| 青州市| 滕州市| 南安市| 汉沽区| 沧州市| 五指山市| 襄城县| 鄂托克旗| 镇安县| 光泽县| 清水县| 龙口市| 长白| 沅陵县| 湖州市| 凯里市| 临沭县| 健康| 罗源县| 崇仁县| 大新县| 金昌市| 安新县|