深入淺出NodeJS——網路編程
Node提供豐富的網路編程模組
| Node模組 |
協議 |
| net |
TCP |
| dgram |
UDP |
| http |
HTTP |
| https |
HTTPS |
TCP服務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