<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    當柳上原的風吹向天際的時候...

    真正的快樂來源于創造

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
    轉載自:
    http://www.cnblogs.com/Mygirl/archive/2012/03/27/2419971.html


         什么是HTTP長連接? HTTP長連接,與一般每次發起http請求或響應都要建立一個tcp連接不同,http長連接利用同一個tcp連接處理多個http請求和響應,也叫 HTTP keep-alive,或者http連接重用。使用http長連接可以提高http請求/響應的性能。

         使用http長連接有很多好處,包括:
    更少的建立和關閉tcp連接,可以減少網絡流量。 因為已建立的tcp握手,減少后續請求的延時。 長時間的連接讓tcp有充足的時間判斷網絡的擁塞情況,方便做出下步操作。

        這些優點在使用https連接時更顯著。可以減少多次建立高消耗的SSL/TLS握手。 在HTTP/1.1中,默認使用的是長連接方式。客戶端默認服務端會保持長連接,即便返回錯誤響應;除非明確指示不使用長連接。同時,協議中也指定了客戶 端可以發送關閉信號到服務端來關閉TCP連接。

        怎樣是連接可以重用? 因為TCP是基于流的協議,所以HTTP協議需要有一種方式來指示前一個響應的結束和后一個響應的開始來重用已建立的連接。所以,它要求連接中傳輸的信息 必須有自定義的消息長度。自定義消息長度可以通過設置 Content-Length 消息頭,若傳輸編碼的實體內容塊,則每個數據塊的標明數據塊的大小,而且響應體也是以一個特殊的數據塊結束。

        若中間存在代理服務器將會如何? 因為長連接僅占用一條傳輸鏈路,所以代理服務器能否正確得與客戶端和服務器端(或者其他代理服務器)發送長連接或非長連接的信號尤為重要。但是HTTP的 客戶端或服務器端來看,代理服務器對他們來說是透明的,即便長連接是需要關注的。

         當前的JDK如何處理Keep-Alive? JDK同時支持HTTP/1.1 和 HTTP/1.0。 當應用程序讀取完響應體內容后或者調用 close() 關閉了URLConnection.getInputStream()返回的流,JDK中的HTTP協議句柄將關閉連接,并將連接放到連接緩存中,以便后 面的HTTP請求使用。 對HTTP keep-Alive 的支持是透明的。但是,你也可以通過系統屬性http.keepAlive和http.maxConnections以及HTTP/1.1協議中的特定的 請求響應頭來控制。控制Keep-Alive表現的系統屬性有:
        http.keepAlive=<布爾值> 默認: true 指定長連接是否支持
        http.maxConnections=<整數> 默認: 5 指定對同一個服務器保持的長連接的最大個數。
        影響長連接的HTTP header是: Connection: close 如果請求或響應中的Connection header被指定為close,表示在當前請求或響應完成后將關閉TCP連接。

         JDK中的當前實現不支持緩存響應體,所以應用程序必須讀取完響應體內容或者調用close()關閉流并丟棄未讀內容來重用連接。此外,當前實現在清理連接時并未使用阻塞讀,這就意味這如果響應體不可用,連接將不能被重用。

        JDK1.5中的新特性 當應用接收到400或500的HTTP響應時,它將忽略IOException 而另發一個HTTP 請求。這種情況下,底層的TCP連接將不會再保持,因為響應內容還在等待被讀取,socket 連接未清理,不能被重用。應用可以在捕獲IOException 以后調用HttpURLConnection.getErrorStream() ,讀取響應內容然后關閉流。但是現存的應用沒有這么做,不能體現出長連接的優勢。為了解決這個問題,介紹下workaround。
    當響應體的狀態碼大于或等于400的時候,workaround 將在一定時間內緩存一定數量的響應內容,釋放底層的socket連接來重用。基本原理是當響應狀態碼大于或等于400時,服務器端會發送一個簡短的響應體來指明連接誰以及如何恢復連接。

       

    下面介紹一些SUN實現中的特定屬性來幫助接收到錯誤響應體后清理連接: 主要的一個是: sun.net.http.errorstream.enableBuffering=<布爾值> 默認: false

         當上面屬性設置為true后,在接收到響應碼大于或等于400是,HTTP 句柄將嘗試緩存響應內容。釋放底層的socket連接來重用。所以,即便應用不調用getErrorStream()來讀取響應內容,或者調用 close()關閉流,底層的socket連接也將保持連接狀態。
    下面的兩個系統屬性是為了更進一步控制錯誤流的緩存行為: sun.net.http.errorstream.timeout=<int> in 毫秒 默認: 300 毫秒

         你如何做可以保持連接為連接狀態呢? 不要忽略響應體而丟棄連接。這樣會是TCP連接閑置,當不再被引用后將會被垃圾回收器回收。 如果getInputStream()返回成功,讀取全部響應內容。如果拋出IOException ,捕獲異常并調用getErrorStream() 讀取響應內容(如果存在響應內容)。
    即便你對響應內容不感興趣,也要讀取它,以便清理連接。但是,如果響應內容很長,你讀取到開始部分后就不感興趣了,可以調用close()來關閉流。值得注意的是,其他部分的數據已在讀取中,所以連接將不能被清理進而被重用。
    下面是一個基于上面建議的代碼樣例:

    try
        URL a = new URL(args[0]); 
        URLConnection urlc = a.openConnection(); 
        is = conn.getInputStream(); 
        int ret = 0; 
        while ((ret = is.read(buf)) > 0) { 
          processBuf(buf); 
        }
        // close the inputstream
        is.close();
    } catch (IOException e) {
        try {
            respCode = ((HttpURLConnection)conn).getResponseCode();
            es = ((HttpURLConnection)conn).getErrorStream();
            int ret = 0;
            // read the response body
            while ((ret = es.read(buf)) > 0) {
                processBuf(buf);
            }
            // close the errorstream
            es.close();
        } catch(IOException ex) {
            // deal with the exception
        }
    }

      如果你預先就對響應內容不感興趣,你可以使用HEAD 請求來代替GET 請求。例如,獲取web資源的meta信息或者測試它的有效性,可訪問性以及最近的修改。下面是代碼片段:

    URL a = new URL(args[0]);
    URLConnection urlc = a.openConnection();
    HttpURLConnection httpc = (HttpURLConnection)urlc;
    // only interested in the length of the resource
    httpc.setRequestMethod("HEAD");
    int len = httpc.getContentLength();
    posted on 2013-04-10 21:16 何楊 閱讀(316) 評論(0)  編輯  收藏 所屬分類: Java
    主站蜘蛛池模板: 无码人妻久久一区二区三区免费 | 成人午夜免费福利视频| 亚洲性猛交XXXX| 一级女人18片毛片免费视频| 午夜老司机永久免费看片| 亚洲国产精品成人精品无码区 | 亚洲午夜无码久久| 成年性羞羞视频免费观看无限| 亚洲日韩精品无码专区网站| 无码人妻一区二区三区免费视频| 亚洲最大免费视频网| 亚洲小视频在线播放| 国产va免费精品观看精品| 亚洲AV日韩AV一区二区三曲| 免费看国产曰批40分钟| 亚洲免费在线视频观看| 久久香蕉国产线看免费| 亚洲综合一区二区国产精品| 成人AV免费网址在线观看| 久久久久亚洲精品美女| 男女免费观看在线爽爽爽视频| 亚洲精品tv久久久久久久久| 99ee6热久久免费精品6| 在线精品亚洲一区二区三区| 亚洲乱色伦图片区小说| jjzz亚洲亚洲女人| 国产精品区免费视频| 亚洲国产日韩精品| 成人免费黄色网址| 亚洲日本中文字幕区| 国产成人免费网站| 国产精品美女久久久免费 | 波多野结衣在线免费视频| ww亚洲ww在线观看国产| 国产一级淫片a免费播放口之 | 亚洲欧洲成人精品香蕉网| 7x7x7x免费在线观看| 国产亚洲人成在线影院| 中文字幕亚洲精品| 99精品一区二区免费视频| 亚洲熟女乱色一区二区三区|