Node.js Net 模塊

Node.js 工具模塊Node.js 工具模塊

Node.js Net 模塊提供了一些用于底層的網(wǎng)絡(luò)通信的小工具,包含了創(chuàng)建服務(wù)器/客戶端的方法,我們可以通過以下方式引入該模塊:

var net = require("net")

方法

序號方法 & 描述
1net.createServer([options][, connectionListener])
創(chuàng)建一個 TCP 服務(wù)器。參數(shù) connectionListener 自動給 'connection' 事件創(chuàng)建監(jiān)聽器。
2net.connect(options[, connectionListener])
返回一個新的 'net.Socket',并連接到指定的地址和端口。
當(dāng) socket 建立的時候,將會觸發(fā) 'connect' 事件。
3net.createConnection(options[, connectionListener])
創(chuàng)建一個到端口 port 和 主機(jī) host的 TCP 連接。 host 默認(rèn)為 'localhost'。
4net.connect(port[, host][, connectListener])
創(chuàng)建一個端口為 port 和主機(jī)為 host的 TCP 連接 。host 默認(rèn)為 'localhost'。參數(shù) connectListener 將會作為監(jiān)聽器添加到 'connect' 事件。返回 'net.Socket'。
5net.createConnection(port[, host][, connectListener])
創(chuàng)建一個端口為 port 和主機(jī)為 host的 TCP 連接 。host 默認(rèn)為 'localhost'。參數(shù) connectListener 將會作為監(jiān)聽器添加到 'connect' 事件。返回 'net.Socket'。
6net.connect(path[, connectListener])
創(chuàng)建連接到 path 的 unix socket 。參數(shù) connectListener 將會作為監(jiān)聽器添加到 'connect' 事件上。返回 'net.Socket'。
7net.createConnection(path[, connectListener])
創(chuàng)建連接到 path 的 unix socket 。參數(shù) connectListener 將會作為監(jiān)聽器添加到 'connect' 事件。返回 'net.Socket'。
8net.isIP(input)
檢測輸入的是否為 IP 地址。 IPV4 返回 4, IPV6 返回 6,其他情況返回 0。
9net.isIPv4(input)
如果輸入的地址為 IPV4, 返回 true,否則返回 false。
10net.isIPv6(input)
如果輸入的地址為 IPV6, 返回 true,否則返回 false。

net.Server

net.Server通常用于創(chuàng)建一個 TCP 或本地服務(wù)器。

序號方法 & 描述
1server.listen(port[, host][, backlog][, callback])
監(jiān)聽指定端口 port 和 主機(jī) host ac連接。 默認(rèn)情況下 host 接受任何 IPv4 地址(INADDR_ANY)的直接連接。端口 port 為 0 時,則會分配一個隨機(jī)端口。
2server.listen(path[, callback])
通過指定 path 的連接,啟動一個本地 socket 服務(wù)器。
3server.listen(handle[, callback])
通過指定句柄連接。
4server.listen(options[, callback])
options 的屬性:端口 port, 主機(jī) host, 和 backlog, 以及可選參數(shù) callback 函數(shù), 他們在一起調(diào)用server.listen(port, [host], [backlog], [callback])。還有,參數(shù) path 可以用來指定 UNIX socket。
5server.close([callback])
服務(wù)器停止接收新的連接,保持現(xiàn)有連接。這是異步函數(shù),當(dāng)所有連接結(jié)束的時候服務(wù)器會關(guān)閉,并會觸發(fā) 'close' 事件。
6server.address()
操作系統(tǒng)返回綁定的地址,協(xié)議族名和服務(wù)器端口。
7server.unref()
如果這是事件系統(tǒng)中唯一一個活動的服務(wù)器,調(diào)用 unref 將允許程序退出。
8server.ref()
與 unref 相反,如果這是唯一的服務(wù)器,在之前被 unref 了的服務(wù)器上調(diào)用 ref 將不會讓程序退出(默認(rèn)行為)。如果服務(wù)器已經(jīng)被 ref,則再次調(diào)用 ref 并不會產(chǎn)生影響。
9server.getConnections(callback)
異步獲取服務(wù)器當(dāng)前活躍連接的數(shù)量。當(dāng) socket 發(fā)送給子進(jìn)程后才有效;回調(diào)函數(shù)有 2 個參數(shù) err 和 count。

事件

序號事件 & 描述
1listening
當(dāng)服務(wù)器調(diào)用 server.listen 綁定后會觸發(fā)。
2connection
當(dāng)新連接創(chuàng)建后會被觸發(fā)。socket 是 net.Socket實(shí)例。
3close
服務(wù)器關(guān)閉時會觸發(fā)。注意,如果存在連接,這個事件不會被觸發(fā)直到所有的連接關(guān)閉。
4error
發(fā)生錯誤時觸發(fā)。'close' 事件將被下列事件直接調(diào)用。

net.Socket

net.Socket 對象是 TCP 或 UNIX Socket 的抽象。net.Socket 實(shí)例實(shí)現(xiàn)了一個雙工流接口。 他們可以在用戶創(chuàng)建客戶端(使用 connect())時使用, 或者由 Node 創(chuàng)建它們,并通過 connection 服務(wù)器事件傳遞給用戶。

事件

net.Socket 事件有:

序號事件 & 描述
1lookup
在解析域名后,但在連接前,觸發(fā)這個事件。對 UNIX sokcet 不適用。
2connect
成功建立 socket 連接時觸發(fā)。
3data
當(dāng)接收到數(shù)據(jù)時觸發(fā)。
4end
當(dāng) socket 另一端發(fā)送 FIN 包時,觸發(fā)該事件。
5timeout
當(dāng) socket 空閑超時時觸發(fā),僅是表明 socket 已經(jīng)空閑。用戶必須手動關(guān)閉連接。
6drain
當(dāng)寫緩存為空得時候觸發(fā)。可用來控制上傳。
7error
錯誤發(fā)生時觸發(fā)。
8close
當(dāng) socket 完全關(guān)閉時觸發(fā)。參數(shù) had_error 是布爾值,它表示是否因?yàn)閭鬏斿e誤導(dǎo)致 socket 關(guān)閉。

屬性

net.Socket 提供了很多有用的屬性,便于控制 socket 交互:

序號屬性 & 描述
1socket.bufferSize
該屬性顯示了要寫入緩沖區(qū)的字節(jié)數(shù)。
2socket.remoteAddress
遠(yuǎn)程的 IP 地址字符串,例如:'74.125.127.100' or '2001:4860:a005::68'。
3socket.remoteFamily
遠(yuǎn)程IP協(xié)議族字符串,比如 'IPv4' or 'IPv6'。
4socket.remotePort
遠(yuǎn)程端口,數(shù)字表示,例如:80 or 21。
5socket.localAddress
網(wǎng)絡(luò)連接綁定的本地接口 遠(yuǎn)程客戶端正在連接的本地 IP 地址,字符串表示。例如,如果你在監(jiān)聽'0.0.0.0'而客戶端連接在'192.168.1.1',這個值就會是 '192.168.1.1'。
6socket.localPort
本地端口地址,數(shù)字表示。例如:80 or 21。
7socket.bytesRead
接收到得字節(jié)數(shù)。
8socket.bytesWritten
發(fā)送的字節(jié)數(shù)。

方法

序號方法 & 描述
1new net.Socket([options])
構(gòu)造一個新的 socket 對象。
2socket.connect(port[, host][, connectListener])
指定端口 port 和 主機(jī) host,創(chuàng)建 socket 連接 。參數(shù) host 默認(rèn)為 localhost。通常情況不需要使用 net.createConnection 打開 socket。只有你實(shí)現(xiàn)了自己的 socket 時才會用到。
3socket.connect(path[, connectListener])
打開指定路徑的 unix socket。通常情況不需要使用 net.createConnection 打開 socket。只有你實(shí)現(xiàn)了自己的 socket 時才會用到。
4socket.setEncoding([encoding])
設(shè)置編碼
5socket.write(data[, encoding][, callback])
在 socket 上發(fā)送數(shù)據(jù)。第二個參數(shù)指定了字符串的編碼,默認(rèn)是 UTF8 編碼。
6socket.end([data][, encoding])
半關(guān)閉 socket。例如,它發(fā)送一個 FIN 包??赡芊?wù)器仍在發(fā)送數(shù)據(jù)。
7socket.destroy()
確保沒有 I/O 活動在這個套接字上。只有在錯誤發(fā)生情況下才需要。(處理錯誤等等)。
8socket.pause()
暫停讀取數(shù)據(jù)。就是說,不會再觸發(fā) data 事件。對于控制上傳非常有用。
9socket.resume()
調(diào)用 pause() 后想恢復(fù)讀取數(shù)據(jù)。
10socket.setTimeout(timeout[, callback])
socket 閑置時間超過 timeout 毫秒后 ,將 socket 設(shè)置為超時。
11socket.setNoDelay([noDelay])
禁用納格(Nagle)算法。默認(rèn)情況下 TCP 連接使用納格算法,在發(fā)送前他們會緩沖數(shù)據(jù)。將 noDelay 設(shè)置為 true 將會在調(diào)用 socket.write() 時立即發(fā)送數(shù)據(jù)。noDelay 默認(rèn)值為 true。
12socket.setKeepAlive([enable][, initialDelay])
禁用/啟用長連接功能,并在發(fā)送第一個在閑置 socket 上的長連接 probe 之前,可選地設(shè)定初始延時。默認(rèn)為 false。 設(shè)定 initialDelay (毫秒),來設(shè)定收到的最后一個數(shù)據(jù)包和第一個長連接probe之間的延時。將 initialDelay 設(shè)為0,將會保留默認(rèn)(或者之前)的值。默認(rèn)值為0.
13socket.address()
操作系統(tǒng)返回綁定的地址,協(xié)議族名和服務(wù)器端口。返回的對象有 3 個屬性,比如{ port: 12346, family: 'IPv4', address: '127.0.0.1' }。
14socket.unref()
如果這是事件系統(tǒng)中唯一一個活動的服務(wù)器,調(diào)用 unref 將允許程序退出。如果服務(wù)器已被 unref,則再次調(diào)用 unref 并不會產(chǎn)生影響。
15socket.ref()
與 unref 相反,如果這是唯一的服務(wù)器,在之前被 unref 了的服務(wù)器上調(diào)用 ref 將不會讓程序退出(默認(rèn)行為)。如果服務(wù)器已經(jīng)被 ref,則再次調(diào)用 ref 并不會產(chǎn)生影響。

實(shí)例

創(chuàng)建 server.js 文件,代碼如下所示:

var net = require('net');
var server = net.createServer(function(connection) { 
   console.log('client connected');
   connection.on('end', function() {
      console.log('客戶端關(guān)閉連接');
   });
   connection.write('Hello World!\r\n');
   connection.pipe(connection);
});
server.listen(8080, function() { 
  console.log('server is listening');
});

執(zhí)行以上服務(wù)端代碼:

$ node server.js
server is listening   # 服務(wù)已創(chuàng)建并監(jiān)聽 8080 端口

新開一個窗口,創(chuàng)建 client.js 文件,代碼如下所示:

var net = require('net');
var client = net.connect({port: 8080}, function() {
   console.log('連接到服務(wù)器!');  
});
client.on('data', function(data) {
   console.log(data.toString());
   client.end();
});
client.on('end', function() { 
   console.log('斷開與服務(wù)器的連接');
});

執(zhí)行以上客戶端的代碼:

連接到服務(wù)器!
Hello World!

斷開與服務(wù)器的連接

Gif 實(shí)例演示

Node.js 工具模塊Node.js 工具模塊