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

首頁 > 語言 > JavaScript > 正文

NodeJS學(xué)習(xí)筆記之網(wǎng)絡(luò)編程

2024-05-06 16:07:26
字體:
供稿:網(wǎng)友
Node.js采用了Google Chrome瀏覽器的V8引擎,性能很好,同時(shí)還提供了很多系統(tǒng)級(jí)的API,如文件操作、網(wǎng)絡(luò)編程等。Node.js則是一個(gè)全面的后臺(tái)運(yùn)行時(shí),為Javascript提供了其他語言能夠?qū)崿F(xiàn)的許多功能。今天我們來看下Nodejs的網(wǎng)絡(luò)編程
 
 

Node提供豐富的網(wǎng)絡(luò)編程模塊

 

Node模塊 協(xié)議
net TCP
dgram UDP
http HTTP
https HTTPS

 

TCP服務(wù)事件分為下面兩類

(1)、服務(wù)器事件

對(duì)于通過net.createServer()創(chuàng)建的服務(wù)器而言,它是一個(gè)EventEmitter實(shí)例,自定義事件有以下幾種:

listening :在調(diào)用listen()綁定端口或Domain Socket后觸發(fā),簡(jiǎn)寫為server.listen(port, listener),通過第二個(gè)參數(shù)傳入。

connection :每個(gè)客戶端套接字連接到 服務(wù)器 時(shí)觸發(fā),簡(jiǎn)潔寫法為通過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ù)端和客戶端之間的通信,既可以通過data事件從一端讀取另一端發(fā)來的數(shù)據(jù),也可以通過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的過程進(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的庫,但社區(qū)的ws模塊封裝了WebSocket的底層實(shí)現(xiàn)如著名的socket.io


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 涡阳县| 杭锦后旗| 栾川县| 双牌县| 尚志市| 庆阳市| 城口县| 太湖县| 枣庄市| 虎林市| 武冈市| 潼关县| 黄平县| 扶风县| 乌拉特中旗| 甘德县| 湟源县| 思茅市| 西林县| 大石桥市| 大厂| 红原县| 南宁市| 苗栗市| 大冶市| 微博| 象山县| 兴文县| 甘洛县| 武平县| 荣成市| 满洲里市| 永年县| 梧州市| 新田县| 五常市| 绥中县| 东海县| 雅安市| 内江市| 泸定县|