NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程
Node提供豐富的網(wǎng)絡(luò)編程模塊
Node模塊 | 協(xié)議 |
net | TCP |
dgram | UDP |
http | HTTP |
https | HTTPS |
TCP服務(wù)事件分為下面兩類
(1)、服務(wù)器事件
對(duì)于通過(guò)net.createServer()創(chuàng)建的服務(wù)器而言,它是一個(gè)EventEmitter實(shí)例,自定義事件有以下幾種:
listening :在調(diào)用listen()綁定端口或Domain Socket后觸發(fā),簡(jiǎn)寫為server.listen(port, listener),通過(guò)第二個(gè)參數(shù)傳入。
connection :每個(gè)客戶端套接字連接到 服務(wù)器 時(shí)觸發(fā),簡(jiǎn)潔寫法為通過(guò)net.createServer(),最后一個(gè)參數(shù)傳遞。
close :當(dāng)服務(wù)器關(guān)閉時(shí)觸發(fā),在調(diào)用server.close()后,服務(wù)器將停止接受新的套接字連接,但保持當(dāng)前存在的連接,等待所有連接斷開后,會(huì)觸發(fā)該事件。
error :當(dāng)服務(wù)器發(fā)生異常時(shí),將會(huì)觸發(fā)該事件。
(2)、連接事件
服務(wù)器可以同時(shí)與多個(gè)客戶端保持連接,對(duì)于每個(gè)連接而言是典型的可寫可讀Stream對(duì)象。Stream對(duì)象可以用于服務(wù)端和客戶端之間的通信,既可以通過(guò)data事件從一端讀取另一端發(fā)來(lái)的數(shù)據(jù),也可以通過(guò)write()方法從一端向另一端發(fā)送數(shù)據(jù)。
data :當(dāng)一端調(diào)用write()發(fā)送數(shù)據(jù)時(shí),另一端會(huì)觸發(fā)data事件,事件傳遞的數(shù)據(jù)就是write()發(fā)送的數(shù)據(jù)
end :當(dāng)連接中的任意一端發(fā)送FIN數(shù)據(jù)時(shí),將會(huì)觸發(fā)該事件。
connect :該事件用于 客戶端 ,當(dāng)套接字與服務(wù)器連接成功時(shí)會(huì)觸發(fā)。
drain :當(dāng)任意一端調(diào)用write()發(fā)送數(shù)據(jù)時(shí),當(dāng)前這端觸發(fā)該事件。
error :當(dāng)異常發(fā)送
close :當(dāng)套接字完全關(guān)閉時(shí)觸發(fā)
timeout :當(dāng)一定時(shí)間后連接不再活躍時(shí),觸發(fā)該事件通知用戶該連接被閑置了。
TCP針對(duì)網(wǎng)絡(luò)中的小數(shù)據(jù)包有一定優(yōu)化策略:Nagle算法,當(dāng)數(shù)據(jù)達(dá)到一定量后才觸發(fā)。
UDP服務(wù)
UDP稱為用戶數(shù)據(jù)包協(xié)議,其不是面向連接的服務(wù)。Node中UDP只是一個(gè)EventEmitter實(shí)例,而非Stream的實(shí)例,具備以下自定義事件:
(1) message :當(dāng)UDP套接字監(jiān)聽網(wǎng)卡端口后,接受消息時(shí)觸發(fā),觸發(fā)攜帶的數(shù)據(jù)為消息Buffer對(duì)象和一個(gè)遠(yuǎn)程地址信息。
(2) listening :當(dāng)UDP套接字開始偵聽時(shí)觸發(fā)該事件。
(3) close :調(diào)用close()方法時(shí)觸發(fā)該事件,并不再觸發(fā)message事件。若需再次觸發(fā)message事件,需要重新綁定。
(4) error :當(dāng)異常發(fā)生時(shí)觸發(fā),若不監(jiān)聽直接拋出,使進(jìn)程退出。
HTTP服務(wù)
Node中http模塊繼承自tcp服務(wù)器(net模塊),它能與多個(gè)客戶端保持連接,由于其不為每個(gè)連接創(chuàng)建線程,保持很低的內(nèi)存占用,所以能實(shí)現(xiàn)高并發(fā)。HTTP服務(wù)和TCP服務(wù)區(qū)別在于,在開啟keepalive之后,一個(gè)TCP會(huì)話可以用于多次請(qǐng)求和響應(yīng)。TCP服務(wù)以connection為單位進(jìn)行服務(wù),HTTP服務(wù)以request單位進(jìn)行服務(wù)。http模塊是將connection到request的過(guò)程進(jìn)行封裝。
http模塊將連接所用的套接字的讀寫抽象為ServerRequest和ServerResponse對(duì)象,分別對(duì)應(yīng)請(qǐng)求和響應(yīng)操作。
(1) HTTP請(qǐng)求
對(duì)于TCP連接的讀操作,http模塊將其封裝為ServerRequest對(duì)象。如報(bào)頭部分req.method、req.url、req.headers,報(bào)文體數(shù)據(jù)部分抽象為一個(gè)只讀的流對(duì)象,若業(yè)務(wù)邏輯需要讀取報(bào)文體中的數(shù)據(jù),則需要這個(gè)數(shù)據(jù)流結(jié)束后才能進(jìn)行操作。
(2) HTTP響應(yīng)
HTTP響應(yīng)封裝了底層連接的寫操作,可以將其看成一個(gè)可寫的流對(duì)象。
響應(yīng)報(bào)文頭部信息方法:res.setHeader()和res.writeHeader()方法,可以多次setHeader進(jìn)行設(shè)置,但必須調(diào)用writeHeader寫入連接才生效。
報(bào)文體部分方法:res.write()和res.end()方法
(3) HTTP服務(wù)端事件
connection :客戶端與服務(wù)端建立TCP連接時(shí),觸發(fā)一次connection事件
request :建立TCP連接后,http模塊底層將數(shù)據(jù)流中抽象出HTTP請(qǐng)求和HTTP響應(yīng),當(dāng)請(qǐng)求數(shù)據(jù)發(fā)送到服務(wù)端,在解析出HTTP請(qǐng)求頭后觸發(fā)該事件;在res.end()后,TCP連接可用于下一次請(qǐng)求。
close :調(diào)用server.close方法停止接收新的連接,已有的連接都斷開時(shí)觸發(fā)該事件。
checkContinue :某些客戶端在發(fā)送較大數(shù)據(jù)時(shí),先發(fā)送一個(gè)頭部帶有Expect: 100-continue的請(qǐng)求到服務(wù)器,服務(wù)觸發(fā)該事件;
connect :當(dāng)客戶端發(fā)起CONNECT請(qǐng)求時(shí)觸發(fā)
upgrade :當(dāng)客戶端要求升級(jí)連接的協(xié)議時(shí),需要和服務(wù)端協(xié)商,客戶端會(huì)在請(qǐng)求頭中帶上Updagrade字段
clientError :連接的客戶端發(fā)送錯(cuò)誤,錯(cuò)誤傳到服務(wù)端此時(shí)觸發(fā)該事件
(4) HTTP客戶端
http模塊提供http.request(options, connect),用于構(gòu)造HTTP客戶端。
HTTP客戶端和服務(wù)端類似,在ClientRequest對(duì)象中,它的事件叫做response,ClientRequest在解析響應(yīng)報(bào)文的時(shí),一解析完響應(yīng)頭就觸發(fā)response事件,同時(shí)傳遞一個(gè)響應(yīng)對(duì)象ClientResponse供操作,后續(xù)響應(yīng)報(bào)文以只讀流的方式提供。
(5) HTTP客戶端事件
response :與服務(wù)端的request事件對(duì)應(yīng)的客戶端在請(qǐng)求發(fā)出后得到響應(yīng)時(shí)觸發(fā)該事件。
socket :當(dāng)?shù)讓舆B接池中建立的連接分配給當(dāng)前請(qǐng)求對(duì)象時(shí)觸發(fā);
connect :當(dāng)客戶端向服務(wù)器發(fā)送CONNECT請(qǐng)求時(shí),若服務(wù)端響應(yīng)了200狀態(tài)碼,客戶端將會(huì)觸發(fā)該事件。
upgrade :客戶端享服務(wù)端發(fā)送Upgrade請(qǐng)求時(shí),若服務(wù)端響應(yīng)了101 Switching Protocols狀態(tài),客戶端將會(huì)觸發(fā)該事件。
continue :客戶端向服務(wù)端發(fā)起Expect: 100-continue頭信息后,以試圖發(fā)送較大數(shù)據(jù),若服務(wù)端響應(yīng)100 continue狀態(tài),服務(wù)端將觸發(fā)該事件
WebSocket服務(wù)
WebSocket最早是作為HTML5重要特性出現(xiàn)的,相比HTTP有以下優(yōu)點(diǎn):
(1) 客戶端和服務(wù)端只建立一次TCP連接,可以使用更少的連接
(2) WebSocket服務(wù)端可以推送數(shù)據(jù)到客戶端,這遠(yuǎn)比HTTP請(qǐng)求響應(yīng)模式更靈活、更高效
(3) 更輕量級(jí)的協(xié)議頭,減少數(shù)據(jù)傳輸
Node中沒有內(nèi)置WebSocket的庫(kù),但社區(qū)的ws模塊封裝了WebSocket的底層實(shí)現(xiàn)如著名的socket.io
- Nodejs學(xué)習(xí)筆記之Global Objects全局對(duì)象
- Nodejs學(xué)習(xí)筆記之NET模塊
- Nodejs學(xué)習(xí)筆記之Stream模塊
- NodeJS學(xué)習(xí)筆記之Http模塊
- NodeJS學(xué)習(xí)筆記之FS文件模塊
- NodeJS學(xué)習(xí)筆記之(Url,QueryString,Path)模塊
- NodeJS學(xué)習(xí)筆記之MongoDB模塊
- NodeJS學(xué)習(xí)筆記之Connect中間件模塊(一)
- NodeJS學(xué)習(xí)筆記之Connect中間件模塊(二)
- NodeJS學(xué)習(xí)筆記之Connect中間件應(yīng)用實(shí)例
相關(guān)文章
Node.js學(xué)習(xí)之查詢字符串解析querystring詳解
這篇文章主要給大家介紹了關(guān)于Node.js查詢字符串解析querystring的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-09-09Node.js折騰記一:讀指定文件夾,輸出該文件夾的文件樹詳解
這篇文章主要介紹了Node.js讀指定文件夾輸出該文件夾文件樹,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04node微信開發(fā)之獲取access_token+自定義菜單
這篇文章主要介紹了node微信開發(fā)之獲取access_token+自定義菜單,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03yarn?install命令報(bào)錯(cuò)warning?package-lock.json?found解決辦法
這篇文章主要給大家介紹了關(guān)于yarn?install命令報(bào)錯(cuò)warning?package-lock.json?found的解決辦法,文中通過(guò)圖文將解決的辦法介紹的非常詳細(xì),還分享了更多yarn install遇到的報(bào)錯(cuò)及解決方案,需要的朋友可以參考下2024-02-02Grunt針對(duì)靜態(tài)文件的壓縮,版本控制打包的實(shí)例講解
下面小編就為大家?guī)?lái)一篇Grunt針對(duì)靜態(tài)文件的壓縮,版本控制打包的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09nodejs中使用worker_threads來(lái)創(chuàng)建新的線程的方法
這篇文章主要介紹了nodejs中使用worker_threads來(lái)創(chuàng)建新的線程的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01詳解node.js平臺(tái)下Express的session與cookie模塊包的配置
本篇文章主要介紹了詳解node.js平臺(tái)下Express的session與cookie模塊包的配置,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-04-04