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

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

May 16, 2016 pm 04:40 PM
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

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

c++開源函式庫有哪些 c++開源函式庫有哪些 Apr 22, 2024 pm 05:48 PM

C++ 提供豐富的開源函式庫,涵蓋以下功能:資料結構和演算法(標準範本庫)多執行緒、正規表示式(Boost)線性代數(Eigen)圖形使用者介面(Qt)電腦視覺(OpenCV)機器學習(TensorFlow)加密(OpenSSL)資料壓縮(zlib)網路程式設計(libcurl)資料庫管理(sqlite3)

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

C++ 函數在網路程式設計中如何處理 DNS 查詢? C++ 函數在網路程式設計中如何處理 DNS 查詢? Apr 27, 2024 pm 06:39 PM

C++標準函式庫提供了函式來處理網路程式設計中的DNS查詢:gethostbyname():根據主機名稱尋找主機資訊。 gethostbyaddr():根據IP位址尋找主機資訊。 dns_lookup():非同步解析DNS。

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs怎麼連接mycat nodejs怎麼連接mycat Apr 21, 2024 am 06:16 AM

在 Node.js 中連接 MyCAT 的步驟:安裝 mycat-ts 依賴。建立連線池,指定主機、連接埠、使用者名稱、密碼和資料庫。使用 query 方法執行 SQL 查詢。使用 close 方法關閉連線池。

C++ 函式在網路程式設計中如何實現網路安全? C++ 函式在網路程式設計中如何實現網路安全? Apr 28, 2024 am 09:06 AM

C++函數在網路程式設計中可實現網路安全,方法包括:1.使用加密演算法(openssl)加密通訊;2.使用數位簽章(cryptopp)驗證資料完整性與傳送者身分;3.防禦跨站腳本攻擊( htmlcxx)過濾和消毒使用者輸入。

nodejs和npm什麼關係 nodejs和npm什麼關係 Apr 21, 2024 am 06:09 AM

Node.js是JavaScript執行環境,npm是其套件管理器。兩者協同工作,使開發者能利用JavaScript編寫伺服器端程序,使用第三方模組,以及輕鬆管理模組。

nodejs適合什麼項目 nodejs適合什麼項目 Apr 21, 2024 am 05:45 AM

Node.js 適用於以下專案類型:網頁和伺服器應用程式事件驅動應用程式即時應用程式資料密集型應用程式命令列工具和腳本輕量級微服務

See all articles