首頁 > web前端 > js教程 > NodeJS學習筆記之網路程式設計_node.js

NodeJS學習筆記之網路程式設計_node.js

WBOY
發布: 2016-05-16 16:40:29
原創
1048 人瀏覽過

Node提供豐富的網路程式設計模組

Node模块 协议
net TCP
dgram UDP
http HTTP
https HTTPS

TCP服務事件分為下面兩類

(1)、伺服器事件

對於透過net.createServer()建立的伺服器而言,它是一個EventEmitter實例,自訂事件有以下幾個:

listening :在呼叫listen()綁定連接埠或Domain Socket後觸發,簡寫為server.listen(port, listener),透過第二個參數傳入。

connection :每個客戶端套接字連接到 伺服器 時觸發,簡潔寫法為透過net.createServer(),最後一個參數傳遞。

close :當伺服器關閉時觸發,在呼叫server.close()後,伺服器將停止接受新的套接字連接,但保持目前存在的連接,等待所有連接斷開後,會觸發該事件。

error :當伺服器發生異常時,將會觸發該事件。

(2)、連接事件

伺服器可以同時與多個客戶端保持連接,對於每個連接而言是典型的可寫可讀Stream物件。 Stream物件可以用於服務端和客戶端之間的通信,既可以透過data事件從一端讀取另一端發來的數據,也可以透過write()方法從一端向另一端發送資料。

data :當一端呼叫write()傳送資料時,另一端會觸發data事件,事件傳遞的資料就是write()傳送的資料

end :當連接中的任意一端發送FIN資料時,將會觸發該事件。

connect :此事件用於 用戶端 ,當套接字與伺服器連線成功時會觸發。

drain :當任意一端呼叫write()傳送資料時,當前這端觸發該事件。

error :當異常發送

close :當套接字完全關閉時觸發

timeout :當一定時間後連線不再活躍時,觸發該事件通知用戶該連線被閒置了。

TCP針對網路中的小資料包有一定最佳化策略:Nagle演算法,當資料達到一定量後才會觸發。

UDP服務

UDP稱為用戶資料包協議,其不是面向連接的服務。 Node中UDP只是EventEmitter實例,而非Stream的實例,具備以下自訂事件:

(1) message :當UDP套接字監聽網卡連接埠後,接受訊息時觸發,觸發攜帶的資料為訊息Buffer物件和一個遠端位址資訊。

(2) listening :當UDP套接字開始偵聽時觸發該事件。

(3) close :呼叫close()方法時觸發該事件,並不再觸發message事件。若需再次觸發message事件,需要重新綁定。

(4) error :當例外發生時觸發,若不監聽直接拋出,使進程退出。

HTTP服務

Node中http模組繼承自tcp伺服器(net模組),它能與多個客戶端保持連接,由於其不為每個連接創建線程,保持很低的記憶體佔用,所以能實現高並發。 HTTP服務和TCP服務差異在於,在開啟keepalive之後,一個TCP會話可以用於多次請求和回應。 TCP服務以connection為單位服務,HTTP服務以request單位進行服務。 http模組是將connection到request的過程進行封裝。

http模組將連接所使用的套接字的讀寫抽象化為ServerRequest和ServerResponse對象,分別對應請求和回應運算。

(1) HTTP請求

對於TCP連線的讀取操作,http模組將其封裝為ServerRequest物件。如標頭部分req.method、req.url、req.headers,封包資料部分抽象化為唯讀的流對象,若業務邏輯需要讀取封包中的數據,則需要這個資料流結束後才能進行操作。

(2) HTTP回應

HTTP回應封裝了底層連接的寫入操作,可以將其視為可寫入的流物件。

回應封包頭部資訊方法:res.setHeader()和res.writeHeader()方法,可以多次setHeader進行設置,但必須呼叫writeHeader寫入連接才生效。

報文體部分方法:res.write()和res.end()方法

(3) HTTP服務端事件

connection :客戶端與服務端建立TCP連線時,觸發一次connection事件

request :建立TCP連線後,http模組底層將資料流中抽像出HTTP請求和HTTP回應,當請求資料傳送到服務端,在解析出HTTP請求頭後觸發該事件;在res.end()後,TCP連線可用於下一次請求。

close :呼叫server.close方法停止接收新的連接,現有的連接都斷開時觸發該事件。

checkContinue :某些客戶端在發送較大資料時,先發送一個頭部帶有Expect: 100-continue的請求到伺服器,服務觸發該事件;

connect :當客戶端發起CONNECT請求時觸發

upgrade :當客戶端要求升級連線的協定時,需要和服務端協商,客戶端會在請求頭中帶上Updagrade欄位

clientError :連線的客戶端傳送錯誤,錯誤傳到服務端此時觸發該事件

(4) HTTP客戶端

http模組提供http.request(options, connect),用於建構HTTP客戶端。

HTTP客戶端和服務端類似,在ClientRequest物件中,它的事件叫做response,ClientRequest在解析回應封包的時,一解析完回應頭就觸發response事件,同時傳遞一個回應物件ClientResponse供操作,後續回應封包以唯讀流的方式提供。

(5) HTTP客戶端事件

response :與服務端的request事件對應的客戶端在請求發出後得到回應時觸發該事件。

socket :當底層連線池中建立的連線分配給目前請求物件時觸發;

connect :當客戶端向伺服器發送CONNECT請求時,若服務端回應了200狀態碼,客戶端將會觸發該事件。

upgrade :客戶端享服務端發送Upgrade請求時,若服務端回應了101 Switching Protocols狀態,客戶端將會觸發該事件。

continue :客戶端向服務端發起Expect: 100-continue頭訊息後,以試圖發送較大數據,若服務端回應100 continue狀態,服務端將觸發該事件

WebSocket服務

WebSocket最早是作為HTML5重要特性出現的,相比HTTP有以下優點:

(1) 客戶端和服務端只建立一次TCP連接,可以使用更少的連接

(2) WebSocket服務端可以推送資料到客戶端,遠比HTTP請求回應模式更有效率

(3) 更輕量級的協定頭,減少資料傳輸

Node中沒有內建WebSocket的函式庫,但社群的ws模組封裝了WebSocket的底層實作如著名的socket.io

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板