国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java實(shí)現(xiàn)Http多次請(qǐng)求復(fù)用同一連接

這篇具有很好參考價(jià)值的文章主要介紹了Java實(shí)現(xiàn)Http多次請(qǐng)求復(fù)用同一連接。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

早在HTTP/1.0時(shí)代,每次HTTP請(qǐng)求都要?jiǎng)?chuàng)建一個(gè)連接,而創(chuàng)建連接的過(guò)程需要消耗資源和時(shí)間,代價(jià)相對(duì)昂貴,為了減少資源消耗,縮短響應(yīng)時(shí)間,就需要重用連接。在后來(lái)的HTTP/1.1中,引入了連接復(fù)用的機(jī)制,Http Header中加入Connection: keep-alive來(lái)告訴對(duì)方這個(gè)請(qǐng)求響應(yīng)完成后先不忙關(guān)閉,這也是本篇文章的由來(lái)。

復(fù)用的基本條件

理論基礎(chǔ)

OSI是Open System Interconnection的縮寫(xiě),意為開(kāi)放式系統(tǒng)互聯(lián)。國(guó)際標(biāo)準(zhǔn)化組織(ISO)制定了OSI模型,該模型定義了不同計(jì)算機(jī)互聯(lián)的標(biāo)準(zhǔn),是設(shè)計(jì)和描述計(jì)算機(jī)網(wǎng)絡(luò)通信的基本框架。也就是如下七層模型:

java循環(huán)發(fā)送http請(qǐng)求,http,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò),Java,http請(qǐng)求,程序員

當(dāng)然也有大家熟知的五層模型,也就是把會(huì)話層、表示層、應(yīng)用層合稱為應(yīng)用層。耳熟能詳?shù)腡CP、UDP屬于數(shù)量稀少的傳輸層協(xié)議。在這之上的應(yīng)用層協(xié)議百花齊放諸如:HTTP、SMTR、FTP......,然后很多中間件也自定義了通訊協(xié)議,比如Dubbo、Mysql。

讀到這里大家可能就已經(jīng)清醒的意識(shí)到,即使同屬應(yīng)用層的協(xié)議,是否支持長(zhǎng)連接也不盡相同。筆者想要傳達(dá)的一個(gè)認(rèn)知:之所以能支持長(zhǎng)連接,那是因?yàn)門(mén)CP經(jīng)歷三次握手建立連接之后,如果不出現(xiàn)其他意外是可以保證連接狀態(tài)的。也就是說(shuō)應(yīng)用層協(xié)議是否屬于長(zhǎng)連接僅僅取決于成功建立TCP,發(fā)送一個(gè)請(qǐng)求之后,對(duì)該連接的處理策略:

  • 如早期的HTTP每次發(fā)送請(qǐng)求,Server端回復(fù)完畢之后直接關(guān)閉則是短連接
  • 如Mysql處理完一條SQL請(qǐng)求,然后繼續(xù)執(zhí)行下一個(gè)則是長(zhǎng)連接

這其實(shí)就是我們的理論基礎(chǔ),HTTP有希望支持長(zhǎng)連接的前提是TCP本身就是長(zhǎng)連接。

現(xiàn)實(shí)基礎(chǔ)

HTTP協(xié)議并非魔法,不是說(shuō)新增一條規(guī)范,也不是簡(jiǎn)簡(jiǎn)單單的Header中加入Connection: keep-alive就能立馬支持長(zhǎng)連接了。想要達(dá)到這個(gè)目的需要Client、Server端共同努力。

客戶端譬如Chrome瀏覽器,服務(wù)端譬如阿里OSS,像這樣兩端都支持了新的規(guī)范,HTTP才能快樂(lè)的成為長(zhǎng)連接陣營(yíng)中的一員。

獲取HTTP資源常見(jiàn)方式

因?yàn)镴DK提供了相關(guān)工具、且平臺(tái)相關(guān)的第三方包也足夠優(yōu)秀,所以Java獲取HTTP資源并非難事。

?

@Slf4j
public class SinaPicDownload {

    /* 微博上某個(gè)畫(huà)師的作品 */
    static final String HTTP_URL = "https://wx3.sinaimg.cn/mw2000/006jQ3i8ly1h5k50zujydj35k0334kjo.jpg";
    /* 下載之后放在顏如玉電腦的io文件下 */
    static final String LOCAL = "/Users/admin/io/靈魂蓮華-皎月.jpeg";

    public static void main(String[] args) {
        try (
            InputStream in = new URL(HTTP_URL).openStream();
            FileOutputStream out = new FileOutputStream(LOCAL)
        ) {
            byte[] buffer = new byte[1024 << 2];
            int read;
            while ((read = in.read(buffer)) > -1) {
                out.write(buffer, 0, read);
            }
            out.flush();
        } 
        catch (Throwable e) {
            log.error("獲取HTTP資源失敗:", e);
        }
    }

}

java循環(huán)發(fā)送http請(qǐng)求,http,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò),Java,http請(qǐng)求,程序員

配合Java 7之后提供的try-with-resources語(yǔ)法糖,你甚至僅僅只需要不到二十行的代碼就可以輕而易舉的達(dá)到目的,但是缺點(diǎn)也顯而易見(jiàn),通過(guò)這種方法每次只能獲取一個(gè)資源,用完之后只能完畢。我當(dāng)時(shí)就在想,Java怎么實(shí)現(xiàn)一次連接多次請(qǐng)求呢?

Transfer-Encoding

筆者在上文提到的理論基礎(chǔ)上推測(cè)到肯定可以使用Java提供的Socket建立TCP連接,關(guān)鍵問(wèn)題是怎么跟Server端描述HTTP請(qǐng)求呢?

java循環(huán)發(fā)送http請(qǐng)求,http,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò),Java,http請(qǐng)求,程序員

類比到現(xiàn)實(shí)生活中,兩者能順暢交流必然要求雙方都可以聽(tīng)懂對(duì)方的語(yǔ)言。那HTTP有沒(méi)有一種Client、Server都能解析的規(guī)范呢,HTTP Transfer-Encoding正是在這種背景下應(yīng)運(yùn)而生。通俗的來(lái)講Transfer-Encoding就是一種雙方都約定好的格式,我按照這個(gè)格式Encoding,你按照這個(gè)格式Decoding,ta大概長(zhǎng)這個(gè)樣子:java循環(huán)發(fā)送http請(qǐng)求,http,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò),Java,http請(qǐng)求,程序員?可想而知?jiǎng)倓偒@取那張圖片資源的是時(shí)候,我們肯定是這么跟新浪微博服務(wù)端說(shuō)的:

?java循環(huán)發(fā)送http請(qǐng)求,http,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò),Java,http請(qǐng)求,程序員

聲明:

  • 真實(shí)的Request Line與圖中一致
  • Header其實(shí)復(fù)雜很多,配圖做了簡(jiǎn)化
  • 該請(qǐng)求Body為空,圖中略過(guò)

簡(jiǎn)略實(shí)現(xiàn)

先聲明一些常量,以備后用

?

@Slf4j
public class ReusableHttp {
    
    /* 顏如玉公司的OSS服務(wù)域名 */
    static final String HOST = "****.oss-cn-zhangjiakou.aliyuncs.com";
    static final int PORT = 80;

    /* 顏如玉在OSS上放置的幾個(gè)資源 */
    static final String[] URLS = new String[]{
        "/context/reusable/gtyj.text",
        "/context/reusable/tlyxqch.text",
        "/context/reusable/yj.text",
        "/context/reusable/ls.text"
    };
    
    /* CR = '\r'; LF = '\n'*/
    static final byte[] CRLF = new byte[]{Chars.CR, Chars.LF};
    static final String LOCAL_PATH = "/Users/admin/io/";
    
}

?建立TCP連接,然后獲得輸出,輸入流

public static void main(String[] args) {
    try {
        try (
            Socket socket = new Socket(HOST, PORT);
            OutputStream out = socket.getOutputStream();
            InputStream in = socket.getInputStream()
        ) {
            /* 復(fù)用連接,獲取資源 */
            reusable(out, in);
        }
    }
    catch (IOException e) {
        log.error("請(qǐng)求出現(xiàn)異常", e);
    }
}

寫(xiě)出Request Line

/**
 * Write Request Line
 *
 * RequestLine encoding規(guī)范
 *
 * **********************************************
 * * method * sp * URL * sp * version * cr * lf *
 * **********************************************
 */
static void writeRequestLine(OutputStream out, String url) throws IOException {
    /* 注意空格一定要按照規(guī)定來(lái)擺放 */
    out.write(("GET " + url + " HTTP/1.1").getBytes());
    /* 最后再寫(xiě)入一個(gè)回車、換行符表示Request Line結(jié)束 */
    out.write(CRLF);
}

寫(xiě)出Request Header

/**
 * Write Request Header
 *
 * HeaderLine encoding規(guī)范
 *
 * *******************************************
 * * header field name * : * value * cr * lf *
 * *******************************************
 * ....
 * *******************************************
 * * header field name * : * value * cr * lf *
 * *******************************************
 * ...
 * ***********
 * * cr * lf *
 * ***********
 * ***************
 * * Entity Body *
 * ***************
 */
static void writeHeaderLine(OutputStream out) throws IOException {
    out.write("Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9".getBytes());
    out.write(CRLF);

    out.write("Accept-Encoding: gzip, deflate".getBytes());
    out.write(CRLF);

    out.write("Accept-Language: zh-CN,zh;q=0.9".getBytes());
    out.write(CRLF);

    out.write("Connection: keep-alive".getBytes());
    out.write(CRLF);

    out.write("Host: kuaimai-sheji.oss-cn-zhangjiakou.aliyuncs.com".getBytes());
    out.write(CRLF);
    /* 最后再寫(xiě)入一個(gè)回車、換行符表示Request Header結(jié)束 */
    out.write(CRLF);
}

因?yàn)槭呛?jiǎn)單的請(qǐng)求,所以直接省略Request Body。發(fā)出如上報(bào)文后,Server端會(huì)解析請(qǐng)求,然后回復(fù)。

/**
 * 1.向Server端寫(xiě)出請(qǐng)求
 * 2.接受Server端回復(fù)
 * 3.寫(xiě)到顏如玉本地機(jī)器的io文件夾下
 *
 * @param out 往Server端寫(xiě)出流
 * @param in  Server端往Client端寫(xiě)入流
 */
static void reusable(OutputStream out, InputStream in) throws IOException {
    for (int i = 0, s = URLS.length; i < s; i++) {
        writeRequestLine(out, URLS[i]);

        writeHeaderLine(out);

        out.flush();

        byte[] bytes = new byte[512];
        in.read(bytes);

        String file = LOCAL_PATH + i + ".text";
        try (
            FileOutputStream fo = new FileOutputStream(file)
        ) {
            fo.write(bytes);
            fo.flush();
        }
        catch (Throwable e) {
            log.error("文件寫(xiě)入出現(xiàn)異常", e);
        }
    }
}

java循環(huán)發(fā)送http請(qǐng)求,http,網(wǎng)絡(luò)協(xié)議,網(wǎng)絡(luò),Java,http請(qǐng)求,程序員文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-768505.html

?可以看到功能已經(jīng)實(shí)現(xiàn),同一連接我反復(fù)請(qǐng)求了四次,最終得到四個(gè)資源。

到了這里,關(guān)于Java實(shí)現(xiàn)Http多次請(qǐng)求復(fù)用同一連接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • java實(shí)現(xiàn)調(diào)用http請(qǐng)求的幾種常見(jiàn)方式

    java實(shí)現(xiàn)調(diào)用http請(qǐng)求的幾種常見(jiàn)方式

    ------ Oracle中文開(kāi)發(fā)者社區(qū) ------ 如果你想要學(xué)習(xí)編程,關(guān)注本博客,持續(xù)獲得技術(shù)支持,持續(xù)獲得技術(shù)咨詢 java開(kāi)發(fā)·企業(yè)官方賬號(hào) Oracle中國(guó)官方賬號(hào) Java中國(guó)管理部 全網(wǎng)粉絲30萬(wàn)+ 華為云享專家 阿里專家博主 CSDN內(nèi)容合伙人 CSDN原力計(jì)劃作者 51CTO專家博主 CSDN博客V賬號(hào) 畢業(yè)于四川

    2024年02月04日
    瀏覽(23)
  • Java實(shí)現(xiàn)HTTP請(qǐng)求的幾種方式-CloseableHttpClient(三)

    Java實(shí)現(xiàn)HTTP請(qǐng)求的幾種方式-CloseableHttpClient(三)

    CloseableHttpClient是在HttpClient的基礎(chǔ)上修改更新而來(lái)的,這里還涉及到請(qǐng)求頭token的設(shè)置(請(qǐng)求驗(yàn)證),利用fastjson轉(zhuǎn)換請(qǐng)求或返回結(jié)果字符串為json格式,當(dāng)然上面兩種方式也是可以設(shè)置請(qǐng)求頭token、json的,這里只在下面說(shuō)明。 基于第一章的測(cè)試接口,建立以下程序 創(chuàng)建客戶端

    2023年04月20日
    瀏覽(100)
  • Java實(shí)現(xiàn)HTTP請(qǐng)求的幾種方式-HttpURLConnection(一)

    在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或測(cè)試自己寫(xiě)的接口是否合適。很多項(xiàng)目都會(huì)封裝規(guī)定好本身項(xiàng)目的接口規(guī)范,所以大多數(shù)需要去調(diào)用對(duì)方提供的接口或第三方接口(短信、天氣等)。 準(zhǔn)備兩個(gè)項(xiàng)目: 項(xiàng)目A: 服務(wù)提供者 項(xiàng)目B:服務(wù)消費(fèi)者 在項(xiàng)目A中

    2024年02月16日
    瀏覽(21)
  • Java 實(shí)現(xiàn) HTTP 請(qǐng)求的四種方式,你都學(xué)會(huì)了么?

    前言 在日常工作和學(xué)習(xí)中,有很多地方都需要發(fā)送HTTP請(qǐng)求,本文以Java為例,總結(jié)發(fā)送HTTP請(qǐng)求的多種方式 HTTP請(qǐng)求實(shí)現(xiàn)過(guò)程 GET 創(chuàng)建遠(yuǎn)程連接 設(shè)置連接方式(get、post、put…) 設(shè)置連接超時(shí)時(shí)間 設(shè)置響應(yīng)讀取時(shí)間 發(fā)起請(qǐng)求 獲取請(qǐng)求數(shù)據(jù) 關(guān)閉連接 POST 創(chuàng)建遠(yuǎn)程連接 設(shè)置連接方

    2024年02月08日
    瀏覽(21)
  • Java http 接口請(qǐng)求

    2024年02月11日
    瀏覽(21)
  • java發(fā)送Http請(qǐng)求

    使用java 11添加的HttpClient新API發(fā)送Http(Https)請(qǐng)求 HTTP客戶端是在Java 11中添加的。它可以用于通過(guò)網(wǎng)絡(luò)請(qǐng)求HTTP資源。它支持 HTTP / 1.1和HTTP / 2(同步和異步編程模型),將請(qǐng)求和響應(yīng)主體作為反應(yīng)流處理,并遵循熟悉的構(gòu)建器模式。 參考文章:https://blog.csdn.net/allway2/article/detail

    2023年04月12日
    瀏覽(20)
  • 【Java】HTTP請(qǐng)求工具類

    在工作中可能存在要去調(diào)用其他項(xiàng)目的接口,這篇文章我們實(shí)現(xiàn)在Java代碼中實(shí)現(xiàn)調(diào)用其他項(xiàng)目的接口。 本章內(nèi)容: 創(chuàng)建一個(gè)攜帶參數(shù)的POST請(qǐng)求,去請(qǐng)求其他項(xiàng)目的接口并返回?cái)?shù)據(jù)。 附加HTTP請(qǐng)求工具類,包含(GET、POST、無(wú)參GET、無(wú)參POST) 導(dǎo)入 pom 依賴 創(chuàng)建一個(gè) 攜帶參數(shù)的

    2024年02月12日
    瀏覽(20)
  • 用java發(fā)送http請(qǐng)求

    在 Java 中發(fā)送 HTTP 請(qǐng)求可以使用標(biāo)準(zhǔn)的 Java 庫(kù)或者第三方庫(kù)。這里介紹使用 Java 標(biāo)準(zhǔn)庫(kù)中的 HttpURLConnection 類來(lái)發(fā)送 HTTP 請(qǐng)求的方法: 首先,使用 URL 類來(lái)創(chuàng)建一個(gè) URL 對(duì)象,指定要訪問(wèn)的 URL。 使用 URL 對(duì)象的 openConnection 方法來(lái)獲取 HttpURLConnection 對(duì)象。 設(shè)置 HTTP 請(qǐng)求的方法

    2024年02月16日
    瀏覽(38)
  • java中線程池是如何實(shí)現(xiàn)復(fù)用的?

    Java 中線程池實(shí)現(xiàn)線程復(fù)用的核心機(jī)制在于通過(guò)維護(hù)一定數(shù)量的核心線程和可擴(kuò)展的工作隊(duì)列來(lái)處理任務(wù)。線程復(fù)用的過(guò)程可以分為以下幾個(gè)步驟: 核心線程復(fù)用: 線程池會(huì)維護(hù)一定數(shù)量的核心線程,這些線程在處理任務(wù)時(shí)會(huì)一直保持存活,不會(huì)被回收。當(dāng)有新任務(wù)提交時(shí),

    2024年02月04日
    瀏覽(20)
  • (下篇)java通過(guò)http請(qǐng)求請(qǐng)求三方接口:設(shè)置請(qǐng)求頭,請(qǐng)求體

    (下篇)java通過(guò)http請(qǐng)求請(qǐng)求三方接口:設(shè)置請(qǐng)求頭,請(qǐng)求體

    介紹:springcloud項(xiàng)目server子模塊內(nèi)部集成了低代碼平臺(tái)來(lái)配置通用列表查詢,需要對(duì)低代碼配置權(quán)限,低代碼使用不了server模塊的feign調(diào)用,只能用http請(qǐng)求去調(diào)用分布式項(xiàng)目的用戶模塊來(lái)獲取權(quán)限,通過(guò)restTemplate調(diào)用接口,postman攜帶token信息可以直接調(diào)通用戶中心,但是通過(guò)

    2024年02月04日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包