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