Node.js Net 模塊

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

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

var net = require("net")

方法

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

net.Server

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

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

事件

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

net.Socket

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

事件

net.Socket 事件有:

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

屬性

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

序號(hào)屬性 & 描述
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)聽(tīng)'0.0.0.0'而客戶端連接在'192.168.1.1',這個(gè)值就會(huì)是 '192.168.1.1'。
6socket.localPort
本地端口地址,數(shù)字表示。例如:80 or 21。
7socket.bytesRead
接收到得字節(jié)數(shù)。
8socket.bytesWritten
發(fā)送的字節(jié)數(shù)。

方法

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

新開一個(gè)窗口,創(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 工具模塊