国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

詳解NODEJS的http實現

2024-05-06 15:22:55
字體:
來源:轉載
供稿:網友

一、前言

目前,HTTP協議是互聯網上應用最為廣泛的一種網絡協議,也是前端er接觸最多的一種協議。通過閱讀http模塊在nodejs中的實現,能夠更深入的了解HTTP協議。HTTP協議是基于TCP協議之上的應用層協議,它的實現離不開TCP/IP協議族。而具體到代碼實現,http模塊依賴于net模塊。

如下圖所示:在nodejs中,http通過net模塊傳輸數據,得到數據之后依靠HTTP_PARSER對數據進行解析。

二、源碼

啟動一個HTTP服務

nodejs中啟動一個HTTP服務很簡單,就是實例化一個Server對象,并且監聽某個端口:

const Server = require('./libs/http').Serverconst server = new Server( function(req, res) {  res.writeHead(200) res.end('hello world')})server.listen(9999) 

SERVER類

Server類繼承于net.Server,并監聽'connection‘事件。

在Server類中,主要做了兩件事: 1. 初始化NET模塊并建立TCP網絡監聽 2. 監聽自身的request事件

當客戶端請求到來的時候,Server實例會首先監聽到 'connection' 事件,建立起TCP連接并在connectionListener中暴露出socket對象。接下來,HTTP模塊就通過socket對象與客戶端進行數據交互。

當一個請求到來后,Server會觸發自身的 request 事件,調用 requestListener 方法,即創建Server實例時傳入的回調函數。

new Server( function(req, res) {  res.writeHead(200) res.end('hello world')})

注: socket對象類似于TCP協議的一個實現,可以通過它與客戶端進行數據交互 注: 在 connectionListener 函數中,還初始化了parser實例,并給它綁定了一個 onIncoming 函數 HTTP Parser
整個解析流程在 connectionListener 中進行,socket 通過 'data' 事件獲取TCP推入的數據

當socket獲取到數據之后,會先對數據進行解析,即:parser.excute(),解析工具是parser。值得說明的是,作者為了實現對 parser 的重用, parser是從一個'FreeList池'中獲取的。

...const parser = parsers.alloc() ...connectionListener(socket) {   socket.on('data', socketOnData)  // TCP推入數據,parser進行解析  function socketOnData(d) {    ...    const ret = parser.execute(d)    ...  }}

1、TCP數據到達時, 先執行execute()

2、順藤摸瓜,我們發現parser.excute 就是 Excute(node_http_parser.cc)。而Excute也只是一個外包而已,具體工作是http_parser_excute(http_parser.c)搞定的。

node_http_parser.cc 只是對 http_parser.c 的一層包裝,http_parser.c依靠對外暴露的7個回調周期函數與 node_http_parser.cc 進行數據交互。

3、http_parser.c只有兩類回調:HTTP_CB、HTTP_DATA_CB。通過重載的方式,在這兩類函數中注冊了8個周期函數,如下圖:

4、雖然http_parser注冊有8個回調函數,但 node_http_parser.cc 對外只暴露出四個周期函數:

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 石阡县| 万荣县| 北宁市| 乾安县| 会同县| 盖州市| 钟山县| 景东| 竹溪县| 芒康县| 富平县| 阿克陶县| 吉安市| 上高县| 弥勒县| 乌苏市| 美姑县| 玛多县| 鹤壁市| 朝阳区| 墨竹工卡县| 昌乐县| 宁陕县| 固安县| 桐梓县| 个旧市| 永登县| 天峻县| 盐城市| 内黄县| 淳安县| 南投县| 定州市| 前郭尔| 柳州市| 乌拉特前旗| 东港市| 兴化市| 桐乡市| 南溪县| 日喀则市|