<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [TOC] ## http是tcp的超集 當瀏覽器請求一個url資源的時候,先和目標服務器建立tcp長連接,然后再發送http請求。(這意味著tcp鏈接建立完成之前,http請求并沒有發送) ![](https://box.kancloud.cn/c2f7f107183b6f8e4cca0b7095e3d3de_495x276.png) 可以看到,這里connection先于request觸發 ### 若http服務器沒有res.end(),即不會斷開連接 ![](https://box.kancloud.cn/219f60c61e1513dec698d972f245629e_782x442.png) #### end先于close ![](https://box.kancloud.cn/5e77b58b46501a86059570980d077922_588x389.png) ### Q #### http只是基于tcp的包裝?還是不同于tcp的另一個鏈接請求? #### request是第一次發數據的時候才觸發嗎? 答:只要客戶端向服務器發送消息,每次都會觸發request事件 #### 發消息就等于客戶端鏈接嗎? 不等于,先建立鏈接才會發送http請求 ## 利用curl發送http請求 下圖中“相應信息”應為“響應信息” **注意**:-X的x為大寫,post也必須為大寫 ![](https://box.kancloud.cn/3888143d82091bbf2db15082a3fa3e31_706x74.png) ### 請求報文 請求行 method url protocol 請求頭 空白行 請求體 ![](https://box.kancloud.cn/ab5d87d0aee5345926c6407d54212543_627x261.png) ![](https://box.kancloud.cn/71facfb45a1c0ce4b8e180317532adc2_965x362.png) ### 響應報文 響應行 protocol statusCode statusDesc 響應頭 空白行 響應體 ![](https://box.kancloud.cn/137951a2ffa83e1a2cee06fff93a714d_375x197.png) ![](https://box.kancloud.cn/9b5e4f4f674ad899e9a795cbcf4b44ca_797x295.png) ![](https://box.kancloud.cn/e5defb142590a505e2ca7eb970a39108_482x312.png) ## 創建一個http服務器 ``` let http = require('http'); let server = http.createServer(function(req,res){ }).listen(8080,function(){ console.log('server is running on the localhost:8080'); }); ``` ### req req代表客戶端的一個請求。 server服務器把客戶端的請求進行解析,然后放在req對象上。 #### 通過req.x的方式獲取請求行和請求頭 ![](https://box.kancloud.cn/d6fb95e9d2b0ee136b11f9de5bf31156_527x408.png) #### req對象中拿不到hash ![](https://box.kancloud.cn/3d6564e034d438b3496f356a6892d88e_694x233.png) #### url.parse(req.url) 獲取 url對象 ``` import url = require('url'); //url為nodeJS中內置的模塊,但需要引用 ``` ![](https://box.kancloud.cn/d80535b6036934433b688d92b00176a8_444x138.png) ##### req.url和url對象的比較 其中`path`為路徑,`pathname`為path去掉`query`的部分 path即是 url從域名后面‘/’及其以后的部分 ![](https://box.kancloud.cn/52b51ccb7121822cdabf057646b5578b_266x414.png) ##### url對象中的query,以及其他 ![](https://box.kancloud.cn/7e343b51e81a991e93f1bb3ce37b7932_502x288.png) #### 從req中獲取請求體 我們不能直接通過req.data的形式拿到請求數據,但! 因為req是一個可讀流,可以通過監聽"data"事件來獲取請求體數據 **注意**:默認拿到的數據為buffer(一段16進制的類數組數據),需要toString ![](https://box.kancloud.cn/c76c6e12160cb0f935c562dc23bea212_506x293.png) ### res res代表響應,如果希望向客戶端回應消息,需要通過res #### 設置響應行和響應頭 statusCode:設置了Code會自動生成對應的描述 sendDate:設置是否在響應中顯示響應開始發送的時間 setHeader:設置響應頭 removeHeader:移除響應頭 getHeader:獲取響應頭 ![](https://box.kancloud.cn/42b3d44f974c66ab4e3e012e7b3c7c71_631x565.png) #### writeHead,可以將狀態碼和響應頭一起寫了 headersSent:響應頭是否已經發送 ![](https://box.kancloud.cn/cc82dbda7ac5bed422a72d256a6517ea_588x180.png) 這個api存在的意義? 當調用write時響應頭就已經發送出去了 為什么調用write就發送了呢? 客戶端這時就開始接收數據了,需要知道接收的數據長撒樣 這里需要注意的是 而這時可能服務器還準備傳點什么給客戶端,還沒有res.end鏈接還沒有掛斷, ![](https://box.kancloud.cn/0173bf14fb920bb7a75ffab0d8d38d8b_1065x356.png) **注意**: 1. 如果是調用write而不是直接調用end,這里會分塊傳輸 見上圖【Transfer-Encoding】 2. 如果響應時沒有end,也不會在響應頭中出現【Content-Length】這個屬性 3. 這里分塊傳輸的時候字節數比應該的多,是因為: 分塊編碼相當簡單,在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報文采用了分塊編碼。這時,報文中的實體需要改為用一系列分塊來傳輸。每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括它結尾的 CRLF(\r\n),也不包括分塊數據結尾的 CRLF。最后一個分塊長度值必須為 0,對應的分塊數據沒有內容,表示實體結束。 相關文章: https://www.cnblogs.com/simonbaker/p/5593177.html ### 創建http服務器的第二種形式 ``` let server = http.createServer(); server.on('connection',function(socket){ }); server.on('request',function(req,res){ }); server.listen(8080,function(){ console.log('server started at http://localhost:8080') }); ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看