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事件將依次獲取來資料進行拼接 當使用者請求結束後...