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