NodeJS學習筆記之網路編程,nodejs學習筆記
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
nodejs前景怎
明確的說,nodejs是一個值得你投入的環境,相比其他伺服器的編程環境,nodejs高效、現代,是業界最新思考的智慧結晶,與雲平台天然的結合。也就是說,不管未來如何發展,nodejs對業界的影響已經存在,並將持續下去。
學習nodejs之前,最好已經很瞭解javascript,以及其編程模式,nodejs的基礎是chrome的V8引擎,以javascript作為其程式設計語言。
Nodejs的問題,javascript編程
你可以看看日誌,可以通過控制台看,看那些模組沒有找到,然後自己 npm一下