Node.js API詳解之 net模塊實例分析
本文實例講述了Node.js API詳解之 net模塊。分享給大家供大家參考,具體如下:
Node.js API詳解之 net
net 模塊提供了創(chuàng)建基于流的 TCP 或 IPC 服務(wù)器(net.createServer())和客戶端(net.createConnection()) 的異步網(wǎng)絡(luò) API。
通過以下方式引入:
const net = require('net');
net.isIP(input)
說明:
測試 input 是否是 IP 地址。無效的字符串則返回 0,IPv4 地址則返回 4,IPv6的地址則返回 6。
demo:
const net = require('net'); console.log( net.isIP('127.0.0.1') ); // 4
net.isIPv4(input)
說明:
如果 input 是 IPv4 地址則返回 true,否則返回 false。
demo:
const net = require('net'); console.log( net.isIPv4('127.0.0.1') ); // true
net.isIPv6(input)
說明:
如果 input 是 IPv6 地址則返回 true,否則返回 false。
demo:
const net = require('net'); console.log( net.isIPv6('127.0.0.1') ); // false
net.createServer([options][, connectionListener])
說明:
創(chuàng)建一個新的TCP或IPC服務(wù)。
options:
allowHalfOpen: 表示是否允許一個半開的TCP連接。 默認值: false
pauseOnConnect:一旦來了連接,是否暫停套接字。 默認值: false
connectionListener:事件自動設(shè)置一個監(jiān)聽器。
如果 allowHalfOpen 被設(shè)置為true, 那么當socket.end() 被顯式調(diào)用時,
如果對邊套接字發(fā)送了一個FIN包,服務(wù)只會返回一個FIN數(shù)據(jù)包, 這會持續(xù)到后來連接處在半閉狀態(tài) (不可讀但是可寫)。
如果 pauseOnConnect 被設(shè)置為 true, 那么與連接相關(guān)的套接字都會暫停,也不會從套接字句柄讀取數(shù)據(jù)。
這樣就允許連接在進程之間傳遞,避免數(shù)據(jù)被最初的進程讀取。 如果想從一個暫停的套接字開始讀數(shù)據(jù),請調(diào)用socket.resume()
服務(wù)可以是一個TCP服務(wù)或者一個 IPC 服務(wù), 這取決于listen() 監(jiān)聽什么
demo:
const net = require('net'); const server = net.createServer((c) => { c.write('hello\r\n'); c.pipe(c); }); server.listen(8124, () => { console.log('server bound'); });
net.createConnection()
說明:
一個用于創(chuàng)建 net.Socket 的工廠函數(shù),立即使用 socket.connect() 初始化鏈接,然后返回啟動連接的 net.Socket。
當連接建立之后,在返回的 socket 上將觸發(fā)一個 ‘connect' 事件。
若制定了最后一個參數(shù) connectListener,則它將會被添加到 ‘connect' 事件作為一個監(jiān)聽器。
注意: net.connect() 函數(shù)也是該函數(shù)的別名。
net.createConnection(options[, connectListener])
說明:
與net.createConnection()功能一致。
connectListener:如果傳遞該參數(shù),將被添加為返回 socket 上的 ‘connect' 事件上的監(jiān)聽器。
注意: net.connect(options[, connectListener]) 函數(shù)也是該函數(shù)的別名。
demo:
const net = require('net'); const client = net.createConnection({ port: 8124 }, () => { //'connect' listener console.log('connected to server!'); client.write('world!\r\n'); }); client.on('data', (data) => { console.log(data.toString()); client.end(); }); client.on('end', () => { console.log('disconnected from server'); }); // 如果要連接到 /tmp/echo.sock,第二行只需要改為: const client = net.createConnection({ path: '/tmp/echo.sock' });
net.createConnection(path[, connectListener])
說明:
初始化一個 IPC 連接。
該方法使用所有默認選項創(chuàng)建一個新的 net.Socket,
使用 socket.connect(path[, connectListener]) 立即初始化連接,然后返回初始化連接的 net.Socket。
path: Socket 應(yīng)該被連接到的路徑。
注意: net.connect(path[, connectListener]) 函數(shù)也是該函數(shù)的別名。
net.createConnection(port[, host][, connectListener])
說明:
初始化一個TCP連接
這個函數(shù)用默認配置創(chuàng)建一個新的net.Socket,
然后socket.connect(port[, host][, connectListener])初始化一個連接,并返回開啟連接的那個 net.Socket。
注意: net.connect(port[, host][, connectListener]) 函數(shù)也是該函數(shù)的別名。
net.Server 類
說明:
這個類用于創(chuàng)建 TCP 或 IPC server。
new net.Server([options][, connectionListener])
說明:
創(chuàng)建一個net.Server實例。
與net.createServer([options][, connectionListener])功能一致
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('error', (err) => { throw err; }); server.listen(8124, () => { console.log('server bound'); });
server.listen()
說明:
為 connections 啟動一個 server 監(jiān)聽.
一個 net.Server 可以是一個 TCP 或者 一個 IPC server,這取決于它監(jiān)聽什么。
可能的參數(shù):
server.listen(handle[, backlog][, callback])
server.listen(options[, callback])
server.listen(path[, backlog][, callback]) for IPC servers
server.listen([port][, host][, backlog][, callback]) for TCP servers
這個函數(shù)是異步的。當 server 開始監(jiān)聽,'listening' 事件會觸發(fā)。
最后一個參數(shù) callback 將會被添加為'listening' 事件的監(jiān)聽器。
監(jiān)聽時,其中一個最常見的錯誤是 EADDRINUSE。這是因為另一個 server 已經(jīng)監(jiān)聽了該請求中的 port / path / handle。
server.listen(handle[, backlog][, callback])
說明:
啟動一個服務(wù)器,監(jiān)聽已經(jīng)綁定到端口、UNIX 域套接字或 Windows 命名管道的給定句柄上的連接。
句柄對象可以是服務(wù)器、套接字(任何具有底層 _handle 成員的東西),
也可以是具有 fd 成員的對象,該成員是一個有效的文件描述符。
注意:在Windows上不支持在文件描述符上進行監(jiān)聽。
server.listen(options[, callback])
說明:
啟動一個TCP服務(wù)監(jiān)聽輸入的port和host。
options:必須。支持以下參數(shù)屬性:
port:端口
host:主機
path:如果指定了 port 參數(shù)則會被忽略。
如果指定了 port 參數(shù),該方法的行為跟 server.listen([port][, hostname][, backlog][, callback]) 一樣。
否則,如果指定了 path 參數(shù),該方法的行為與 server.listen(path[, backlog][, callback]) 一致。
如果沒有 port 或者 path 參數(shù),則會拋出一個錯誤。
server.listen(path[, backlog][, callback])
說明:
啟動一個 IPC 服務(wù)器監(jiān)聽給定 path 的連接。
path:服務(wù)器需要監(jiān)聽的路徑
server.listen([port][, host][, backlog][, callback])
說明:
啟動一個TCP服務(wù)監(jiān)聽輸入的port和host。
如果port省略或是0,系統(tǒng)會隨意分配一個在'listening'事件觸發(fā)后能被server.address().port檢索的無用端口。
server.listening
說明:
一個布爾值, 表明 server 是否正在監(jiān)聽連接
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('error', (err) => { throw err; }); server.listen(8124, () => { console.log(server.listening); }); // true
listening 事件
說明:
當服務(wù)被綁定后調(diào)用
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('listening', () => { console.log('開始監(jiān)聽'); }); server.listen(8124, () => { console.log(server.listening); }); // 開始監(jiān)聽
server.address()
說明:
如果在IP socket上監(jiān)聽,則返回綁定的ip地址, 地址族和操作系統(tǒng)報告的服務(wù)端口
在找到操作系統(tǒng)分配的地址時,找到指定的端口是有用的.
返回一個有 port, family, 和 address 屬性: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }的對象
對于在管道或UNIX域套接字上偵聽的server,該名稱將返回為字符串
只有到了 ‘listening' 事件被觸發(fā)時候.才可以調(diào)用 server.address()
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('error', (err) => { throw err; }); server.listen(8124, () => { console.log('opened server on', server.address()); }); // opened server on { address: '::', family: 'IPv6', port: 8124 }
server.maxConnections
說明:
設(shè)置該屬性使得當 server 連接數(shù)過多時拒絕連接。
一旦將一個 socket 發(fā)送給 child_process.fork() 生成的子進程,就不推薦使用該選項。
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.maxConnections = 10; server.listen(8124, () => { console.log(server.listening); });
server.getConnections(callback)
說明:
異步獲取服務(wù)器的當前并發(fā)連接數(shù)。當 socket 被傳遞給子進程時工作。
回調(diào)函數(shù)的兩個參數(shù)是 err 和 count。
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.getConnections((err, count) => { console.log(count); }); server.listen(8124, () => { console.log(server.listening); }); // 0
server.connections (已廢棄)
說明:
獲取服務(wù)器的當前并發(fā)連接數(shù)。
connection 事件
說明:
當一個新的connection建立的時候觸發(fā). 傳遞一個 net.Socket的實例對象.
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('connection', (socket) => { console.log(socket); }); server.listen(8124, () => { console.log(server.listening); });
server.unref()
說明:
如果這個server在事件系統(tǒng)中是唯一有效的,那么對server調(diào)用unref將允許程序退出。
如果這個server已經(jīng)調(diào)用過unref那么再次調(diào)用將不會再有效果。
server.ref()
說明:
在一個已經(jīng)調(diào)用 unref 的 server 中調(diào)用 ref,如果 server 是僅存的 server,則程序不會退出(默認)。
對一個已經(jīng)調(diào)用 ref 的 server 再次調(diào)用 ref 將不會再有效果。
server.close([callback])
說明:
停止 server接受建立新的connections并保持已經(jīng)存在的connections.
此功能是異步的,當所有的connections關(guān)閉同時server響應(yīng) ‘close'事件的時候,server將會最終關(guān)閉.
一旦'close'發(fā)生將會調(diào)用可選的回調(diào)函數(shù). 與該事件不同, 如果服務(wù)器在關(guān)閉時未打開,則將使用錯誤作為唯一參數(shù)。
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.listen(8124, () => { console.log(server.listening); }); server.close();
close 事件
說明:
當server關(guān)閉的時候觸發(fā). 注意,如果有連接存在, 直到所有的連接結(jié)束才會觸發(fā)這個事件
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('close', () => { console.log('server 已關(guān)閉') }) server.listen(8124, () => { console.log(server.listening); }); server.close(); // server 已關(guān)閉
error 事件
說明:
當錯誤出現(xiàn)的時候觸發(fā).
不同于 net.Socket, ‘close' 事件不會在這個事件觸發(fā)后繼續(xù)觸發(fā)
除非 server.close() 是手動調(diào)用. 在 server.listen()中的例子.
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('error', (err) => { console.log('發(fā)生異常', err); }) server.listen(8124, () => { console.log(server.listening); });
net.Socket 類
說明:
這個類是 TCP 或 UNIX Socket 的抽象(在Windows上使用命名管道,而UNIX使用域套接字)。
一個net.Socket也是一個duplex stream,所以它能被讀或?qū)?,并且它也是一個EventEmitter。
net.Socket可以被用戶創(chuàng)建并直接與server通信。
舉個例子,它是通過net.createConnection()返回的,所以用戶可以使用它來與server通信。
當一個連接被接收時,它也能被Node.js創(chuàng)建并傳遞給用戶。
比如,它是通過監(jiān)聽在一個net.Server上的'connection'事件觸發(fā)而獲得的,那么用戶可以使用它來與客戶端通信。
new net.Socket([options])
說明:
創(chuàng)建一個 socket 對象。
options:
fd:如果指定了該參數(shù),則使用一個給定的文件描述符包裝一個已存在的 socket,否則將創(chuàng)建一個新的 socket。
allowHalfOpen:指示是否允許半打開的 TCP 連接。默認是 false。
readable:當傳遞了 fd 時允許讀取 socket,否則忽略。默認 false。
writable:當傳遞了 fd 時允許寫入 socket,否則忽略。默認 false。
新創(chuàng)建的 socket 可以是 TCP socket 也可以是 IPC 端點流,取決于它連接 connect() 到什么。
socket.connect()
說明:
在給定的套接字上啟動一個連接。
該方法是異步的。當連接建立了的時候,'connect' 事件將會被觸發(fā)。
如果連接過程中有問題,'error' 事件將會代替 ‘connect' 事件被觸發(fā),并將錯誤信息傳遞給 ‘error' 監(jiān)聽器。
最后一個參數(shù) connectListener,如果指定了,將會被添加為 ‘connect' 事件的。
可能的用法:
socket.connect(options[, connectListener])
socket.connect(path[, connectListener]) 用于 IPC 連接。
socket.connect(port[, host][, connectListener]) 用于 TCP 。
socket.connect(options[, connectListener])
說明:
在給定的 socket 上初始化一個連接。
通常該方法是不需要的,應(yīng)該使用 net.createConnection() 來創(chuàng)建和打開 socket。
一般只在實現(xiàn)一個自定義的 Socket 的時候使用該方法。
對于 TCP 連接可能的 options 有:
port 必須。Socket 連接的端口。
host Socket 連接的主機。默認是 ‘localhost'.
localAddress Socket 連接的本地地址。
localPort Socket 連接的本地端口。
family IP棧的版本,可以是4或6。默認值為4。
hints 可選的dns.lookup() hints.
lookup 自定義的 lookup 方法。默認是 dns.lookup().
對于 IPC 連接可能的 options 有:
path 必須??蛻舳诉B接的路徑。
socket.connect(path[, connectListener])
說明:
在給定的 socket 上初始化 IPC 。
相當使用 { path: path } 作為 options 調(diào)用 socket.connect(options[, connectListener]) 方法。
socket.connect(port[, host][, connectListener])
說明:
在給定的 socket 上初始化一個 TCP 連接。
相當于使用 {port: port, host: host} 作為 options 調(diào)用 socket.connect(options[, connectListener]) 方法。
connect 事件
說明:
當一個 socket 連接成功建立的時候觸發(fā)該事件。
socket.connecting
說明:
該屬性如果為 true 則socket.connect(options[, connectListener]) 被調(diào)用但還未結(jié)束。
當發(fā)送 connect 事件或調(diào)用 socket.connect(options[, connectListener]) 的回調(diào)函數(shù)的時候會被設(shè)置為 false。
close 事件
說明:
一旦 socket 完全關(guān)閉就發(fā)出該事件。
參數(shù) had_error 是 boolean 類型,表明 socket 被關(guān)閉是否取決于傳輸錯誤。
data 事件
說明:
當接收到數(shù)據(jù)的時觸發(fā)該事件。data 參數(shù)是一個 Buffer 或 String。
數(shù)據(jù)編碼由 socket.setEncoding() 設(shè)置。
注意:當 Socket 發(fā)送 data 事件的時候,如果沒有監(jiān)聽者數(shù)據(jù)將會丟失。
drain 事件
說明:
當寫入緩沖區(qū)變?yōu)榭諘r觸發(fā)。可以用來做上傳節(jié)流。
error 事件
說明:
當錯誤發(fā)生時觸發(fā)。'close' 事件也會緊接著該事件被觸發(fā)。
lookup 事件
說明:
在找到主機之后創(chuàng)建連接之前觸發(fā)。不可用于 UNIX socket。
參數(shù):
err:錯誤對象。
address:IP地址
family:地址類型。
host:主機
timeout 事件
說明:
當 socket 超時的時候觸發(fā)。該事件只是用來通知 socket 已經(jīng)閑置。用戶必須手動關(guān)閉。
socket.address()
說明:
返回操作系統(tǒng)報告的 socket 的地址、地址族和端口。
返回的對象有三個屬性,例如: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }
socket.bufferSize
說明:
net.Socket 具有該屬性,socket.write() 工作時需要。它可以幫助用戶快速啟動和運行。
計算機(處理速度)不能總是跟上 socket 的寫入速度 – 網(wǎng)絡(luò)連接可能太慢了。
Node.js 內(nèi)部將維護一個寫入 socket 的數(shù)據(jù)隊列,并在可能的時候?qū)?shù)據(jù)發(fā)送出去。
(內(nèi)部實現(xiàn)是對 socket 的文件描述符進行輪訓其是否是可寫狀態(tài)。)
使用內(nèi)部緩沖的結(jié)果是可能造成內(nèi)存的增長。此屬性顯示當前即將被寫入的緩沖的字符數(shù)。
(字符串的數(shù)目大致等于即將被寫入的字節(jié),但緩沖可能包含字符串,而字符串是惰性編碼的,所以實際的字節(jié)數(shù)是不知道的。)
對處理大量或持續(xù)增長的 bufferSize 有經(jīng)驗的用戶應(yīng)該注意使用 socket.pause() and socket.resume() 對他們程序中的數(shù)據(jù)流進行節(jié)流。
socket.bytesRead
說明:
接收的字節(jié)數(shù)量。
socket.bytesWritten
說明:
發(fā)送的字節(jié)數(shù)量。
socket.destroy([exception])
說明:
確保在該 socket 上不再有 I/O 活動。僅在出現(xiàn)錯誤的時候才需要(如解析錯誤等)。
如果制定了 exception,則將會觸發(fā)一個 ‘error' 事件,任何監(jiān)聽器都將接收到 exception 作為一個參數(shù)。
socket.destroyed
說明:
一個布爾值,用來指示連接是否已經(jīng)被銷毀。一旦連接被銷毀就不能再使用它傳輸任何數(shù)據(jù)。
socket.end([data][, encoding])
說明:
半關(guān)閉 socket。例如發(fā)送一個 FIN 包。服務(wù)端仍可以發(fā)送數(shù)據(jù)。
如果指定了 data,則相當于調(diào)用 socket.write(data, encoding) 之后再調(diào)用 socket.end()。
end 事件
說明:
當 socket 的另一端發(fā)送一個 FIN 包的時候觸發(fā),從而結(jié)束 socket 的可讀端。
默認情況下(allowHalfOpen為false),socket 將發(fā)送一個 FIN 數(shù)據(jù)包,
并且一旦寫出它的等待寫入隊列就銷毀它的文件描述符。
當然,如果 allowHalfOpen 為 true,socket 就不會自動結(jié)束 end() 它的寫入端,允許用戶寫入任意數(shù)量的數(shù)據(jù)。
用戶必須調(diào)用 end() 顯示地結(jié)束這個連接(例如發(fā)送一個 FIN 數(shù)據(jù)包。)
socket.localAddress
說明:
遠程客戶端連接的本地 IP 地址字符串。
例如,一個服務(wù)端正在連接到 ‘0.0.0.0',客戶端連接到的是 ‘192.168.1.1',則 socket.localAddress 的值是 ‘192.168.1.1'。
socket.localPort
說明:
用數(shù)字表示的本地端口。例如 80 或 21。
socket.pause()
說明:
暫停讀寫數(shù)據(jù)。也就是說,'data' 將不會再被觸發(fā)??梢杂糜谏蟼鞴?jié)流
socket.resume()
說明:
在調(diào)用 socket.pause() 之后恢復讀取數(shù)據(jù)。
socket.unref()
說明:
如果活躍的 socket 是事件系統(tǒng)中僅存的 socket,則調(diào)用 unref 將會允許程序退出。
對一個已經(jīng)調(diào)用了 unref 的 socket 再調(diào)用 unref 無效。
socket.ref()
說明:
與 unref 相反,在一個已經(jīng)調(diào)用 unref 的 socket 中調(diào)用 ref,
如果 socket 是僅存的 socket,則程序不會退出(默認)。對一個已經(jīng)調(diào)用 ref 的 socket 再次調(diào)用 ref 將不會再有效果。
socket.remoteAddress
說明:
用字符串表示的遠程 IP 地址。例如 ‘74.125.127.100' 或 ‘2001:4860:a005::68'。
如果 socket 被銷毀了(如客戶端已經(jīng)失去連接)則其值為 undefined。
socket.remoteFamily
說明:
用字符串表示的遠程 IP 協(xié)議族。'IPv4′ 或 ‘IPv6'。
socket.remotePort
說明:
用數(shù)字表示的遠程端口。例如 80 或 21。
socket.setEncoding([encoding])
說明:
設(shè)置作為可讀流(Readable Stream)的編碼。
socket.setKeepAlive([enable][, initialDelay])
說明:
啟用/禁用長連接功能, 并且在第一個長連接探針被發(fā)送到一個空閑的 socket 之前可選則配置初始延遲。enable 默認為 false。
initialDelay(毫秒)用來設(shè)置接收到最后一個數(shù)據(jù)包和發(fā)送第一個長連接探針之間的延遲。
將 initialDelay 設(shè)置為 0,則會保持默認值(或之前設(shè)置的值)不變。默認是 0。
socket.setNoDelay([noDelay])
說明:
禁止 Nagle 。默認情況下 TCP 連接使用 Nagle 算法,在發(fā)送之前緩沖數(shù)據(jù)。
將 noDelay 設(shè)置為 true 將會在每次 socket.write() 被調(diào)用的時候立即發(fā)送數(shù)據(jù)。noDelay默認是 true。
socket.setTimeout(timeout[, callback])
說明:
當 socket 在 timeout 毫秒不活動之后將其設(shè)置為超時狀態(tài)。默認 net.Socket 沒有超時。
當一個閑置的超時被觸發(fā),socket 將會收到一個 ‘timeout' 事件,但連接不會被斷開。
用戶必須手動調(diào)用 socket.end() 或 socket.destroy() 來斷開連接。
如果 timeout 是 0,則存在的閑置超時將會被禁止。
可選的 callback 參數(shù)將會被當作一個時間監(jiān)聽器被添加到 ‘timeout' 事件。
socket.write(data[, encoding][, callback])
說明:
在 socket 上發(fā)送數(shù)據(jù)。第二個參數(shù)制定了字符串的編碼 – 默認是 UTF8 編碼。
如果全部數(shù)據(jù)都成功刷新到內(nèi)核的緩沖則返回 true。
如果全部或部分數(shù)據(jù)在用戶內(nèi)中排隊,則返回 false。當緩沖再次空閑的時候?qū)⒂|發(fā) ‘drain' 事件。
當數(shù)據(jù)最終都被寫出之后,可選的 callback 參數(shù)將會被執(zhí)行 – 可能不會立即執(zhí)行。
希望本文所述對大家node.js程序設(shè)計有所幫助。
相關(guān)文章
nodejs16.15.0版本如何解決node-sass和sass-loader版本沖突問題
這篇文章主要介紹了nodejs16.15.0版本如何解決node-sass和sass-loader版本沖突問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-08-08使用 Node.js 實現(xiàn)圖片的動態(tài)裁切及算法實例代碼詳解
這篇文章主要介紹了使用 Node.js 實現(xiàn)圖片的動態(tài)裁切功能,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2018-09-09輕松創(chuàng)建nodejs服務(wù)器(10):處理POST請求
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(10):處理POST請求,本文告訴你如何實現(xiàn)在node.js中處理POST請求,需要的朋友可以參考下2014-12-12Node.js學習教程之HTTP/2服務(wù)器推送【譯】
這篇文章主要給大家介紹了關(guān)于Node.js學習教程之HTTP/2服務(wù)器推送的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2017-10-10