nodejs中的網路程式設計

2021-09-21 18:36:57 字數 2620 閱讀 8913

node提供了net、dgram、http、https這4個模組,分別用於處理tcp、udp、http、https,適用於伺服器端和客戶端。

tcp服務在網路應用中十分常見,目前大多數的應用都是基於tcp搭建而成的

tcp全名為傳輸控制協議在osi模型(由七層組成,分別為物理層、資料鏈結層、網路層、 傳輸層、會話層、表示層、應用層)中屬於傳輸層協議。許多應用層協議基於tcp構建,典型的 是http、smtp、imap等協議。七層協議示意圖如圖

tcp是面向連線的協議,其顯著的特徵是在傳輸之前需要3次握手形成會話

只有會話形成之後,伺服器端和客戶端之間才能互相傳送資料。在建立會話的過程中,服務 器端和客戶端分別提供乙個套接字,這兩個套接字共同形成乙個連線。伺服器端與客戶端則通過 套接字實現兩者之間連線的操作。

tcp服務的事件

伺服器事件

對於通過net.createserver()建立的伺服器而言,它是乙個eventemitter例項,它的自定義 事件有如下幾種。

listening:在呼叫server.listen()繫結埠或者domain socket後觸發,簡潔寫法為 server.listen(port,listeninglistener),通過listen()方法的第二個引數傳入。

connection:每個客戶端套接字連線到伺服器端時觸發,簡潔寫法為通過net.create- server(),最後乙個引數傳遞。

close:當伺服器關閉時觸發,在呼叫server.close()後,伺服器將停止接受新的套接字 連線,但保持當前存在的連線,等待所有連線都斷開後,會觸發該事件。

error:當伺服器發生異常時,將會觸發該事件。比如偵聽乙個使用中的埠,將會觸發 乙個異常,如果不偵聽error事件,伺服器將會丟擲異常。

連線事件

伺服器可以同時與多個客戶端保持連線,對於每個連線是典型的可寫可讀stream物件。 stream物件可以用於伺服器端和客戶端之間的通訊,既可以通過data事件從一端讀取另一端發來 的資料,也可以通過write()方法從一端向另一端傳送資料。它具有如下自定義事件。

data:當一端呼叫write()傳送資料時,另一端會觸發data事件,事件傳遞的資料即是 write()傳送的資料。

end:當連線中的任意一端傳送了fin資料時,將會觸發該事件。

connect:該事件用於客戶端,當套接字與伺服器端連線成功時會被觸發。

drain:當任意一端呼叫write()傳送資料時,當前這端會觸發該事件

error:當異常發生時,觸發該事件。

close:當套接字完全關閉時,觸發該事件。

timeout:當一定時間後連線不再活躍時,該事件將會被觸發,通知使用者當前該連線已經

被閒置了。

另外,由於tcp套接字是可寫可讀的stream物件,可以利用pipe()方法巧妙地實現管道操作,

如下**實現了乙個echo伺服器:

const net =

require

('net');

const server = net.

createserver

(function

(socket));

server.

listen

(8088

,'127.0.0.1'

);

值得注意的是,tcp針對網路中的小資料報有一定的優化策略:nagle演算法

如果每次只發,網路中將充滿只有極少數有效資料的資料報,將十分浪費網路資源。 nagle演算法針對這種情況,要求緩衝區的資料達到一定數量或者一定時間後才將其發出,所以小 資料報將會被nagle演算法合併,以此來優化網路。這種優化雖然使網路頻寬被有效地使用,但是資料有可能被延遲傳送

在node中,由於tcp預設啟用了nagle演算法,可以呼叫socket.setnodelay(true)去掉nagle算 法,使得write()可以立即傳送資料到網路中。

另乙個需要注意的是,儘管在網路的一端呼叫write()會觸發另一端的data事件,但是並不 意味著每次write()都會觸發一次data事件,在關閉掉nagle演算法後,另一端可能會將接收到的多 個小資料報合併,然後只觸發一次data事件。

udp 又稱使用者資料報協議,與tcp 一樣同屬於網路傳輸層

udp與tcp的區別:

tcp面向連線 udp面向事務

建立udp套接字

udp套接字一旦建立成功既可以作為客戶端傳送資料,也可以作為服務端接受資料。

建立udp套接字

NodeJS中的網路程式設計

3 tcp server 4 結語 5 參考文章 常聽到網路程式設計,自己也有些模糊的概念,或許在 都用到過,只是不知道那是網路程式設計而已,今天花時間來好好理解一下,謹作為筆記行和分享,如果這裡有什麼需要補充或者不對的地方,歡迎道友指正 網路程式設計從大的方面說就是對資訊的傳送到接收,中間傳輸為物...

NodeJS 五 udp網路程式設計

var dgram require dgram var serverudp dgram.createsocket udp4 serverudp.on message function msg,rinfo serverudp.on listening function serverudp.bind 1...

nodeJS中的非同步程式設計

nodejs 不是單執行緒 在部落格專案中關於非同步問題 1.當使用者新增一條部落格時 需要通過post方式向伺服器傳送資料 後台獲取使用者以post方式拿到傳送過來的資料 然後存入資料庫 上面的 建立乙個空字串 當使用者向伺服器傳送請求時出發data事件將依次獲取來資料進行拼接 當使用者請求結束後...