溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js API中net模塊的用法

發(fā)布時間:2020-07-23 16:50:03 來源:億速云 閱讀:416 作者:小豬 欄目:web開發(fā)

這篇文章主要講解了Node.js API中net模塊的用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

net 模塊提供了創(chuàng)建基于流的 TCP 或 IPC 服務器(net.createServer())和客戶端(net.createConnection()) 的異步網絡 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服務。
options:
allowHalfOpen: 表示是否允許一個半開的TCP連接。 默認值: false
pauseOnConnect:一旦來了連接,是否暫停套接字。 默認值: false
connectionListener:事件自動設置一個監(jiān)聽器。
如果 allowHalfOpen 被設置為true, 那么當socket.end() 被顯式調用時,
如果對邊套接字發(fā)送了一個FIN包,服務只會返回一個FIN數據包, 這會持續(xù)到后來連接處在半閉狀態(tài) (不可讀但是可寫)。
如果 pauseOnConnect 被設置為 true, 那么與連接相關的套接字都會暫停,也不會從套接字句柄讀取數據。
這樣就允許連接在進程之間傳遞,避免數據被最初的進程讀取。 如果想從一個暫停的套接字開始讀數據,請調用socket.resume()
服務可以是一個TCP服務或者一個 IPC 服務, 這取決于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 的工廠函數,立即使用 socket.connect() 初始化鏈接,然后返回啟動連接的 net.Socket。
當連接建立之后,在返回的 socket 上將觸發(fā)一個 ‘connect' 事件。
若制定了最后一個參數 connectListener,則它將會被添加到 ‘connect' 事件作為一個監(jiān)聽器。
注意: net.connect() 函數也是該函數的別名。

net.createConnection(options[, connectListener])

說明:

與net.createConnection()功能一致。
connectListener:如果傳遞該參數,將被添加為返回 socket 上的 ‘connect' 事件上的監(jiān)聽器。
注意: net.connect(options[, connectListener]) 函數也是該函數的別名。

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 應該被連接到的路徑。
注意: net.connect(path[, connectListener]) 函數也是該函數的別名。

net.createConnection(port[, host][, connectListener])

說明:

初始化一個TCP連接
這個函數用默認配置創(chuàng)建一個新的net.Socket,
然后socket.connect(port[, host][, connectListener])初始化一個連接,并返回開啟連接的那個 net.Socket。
注意: net.connect(port[, host][, connectListener]) 函數也是該函數的別名。

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)聽什么。
可能的參數:
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
這個函數是異步的。當 server 開始監(jiān)聽,'listening' 事件會觸發(fā)。
最后一個參數 callback 將會被添加為'listening' 事件的監(jiān)聽器。
監(jiān)聽時,其中一個最常見的錯誤是 EADDRINUSE。這是因為另一個 server 已經監(jiān)聽了該請求中的 port / path / handle。

server.listen(handle[, backlog][, callback])

說明:

啟動一個服務器,監(jiān)聽已經綁定到端口、UNIX 域套接字或 Windows 命名管道的給定句柄上的連接。
句柄對象可以是服務器、套接字(任何具有底層 _handle 成員的東西),
也可以是具有 fd 成員的對象,該成員是一個有效的文件描述符。
注意:在Windows上不支持在文件描述符上進行監(jiān)聽。

server.listen(options[, callback])

說明:

啟動一個TCP服務監(jiān)聽輸入的port和host。
options:必須。支持以下參數屬性:
port:端口
host:主機
path:如果指定了 port 參數則會被忽略。
如果指定了 port 參數,該方法的行為跟 server.listen([port][, hostname][, backlog][, callback]) 一樣。
否則,如果指定了 path 參數,該方法的行為與 server.listen(path[, backlog][, callback]) 一致。
如果沒有 port 或者 path 參數,則會拋出一個錯誤。

server.listen(path[, backlog][, callback])

說明:

啟動一個 IPC 服務器監(jiān)聽給定 path 的連接。
path:服務器需要監(jiān)聽的路徑

server.listen([port][, host][, backlog][, callback])

說明:

啟動一個TCP服務監(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 事件

說明:

當服務被綁定后調用

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)報告的服務端口
在找到操作系統(tǒng)分配的地址時,找到指定的端口是有用的.
返回一個有 port, family, 和 address 屬性: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }的對象
對于在管道或UNIX域套接字上偵聽的server,該名稱將返回為字符串
只有到了 ‘listening' 事件被觸發(fā)時候.才可以調用 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

說明:

設置該屬性使得當 server 連接數過多時拒絕連接。
一旦將一個 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)

說明:

異步獲取服務器的當前并發(fā)連接數。當 socket 被傳遞給子進程時工作。
回調函數的兩個參數是 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

說明:

獲取服務器的當前并發(fā)連接數。

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調用unref將允許程序退出。
如果這個server已經調用過unref那么再次調用將不會再有效果。

server.ref()

說明:

在一個已經調用 unref 的 server 中調用 ref,如果 server 是僅存的 server,則程序不會退出(默認)。
對一個已經調用 ref 的 server 再次調用 ref 將不會再有效果。

server.close([callback])

說明:

停止 server接受建立新的connections并保持已經存在的connections.
此功能是異步的,當所有的connections關閉同時server響應 ‘close'事件的時候,server將會最終關閉.
一旦'close'發(fā)生將會調用可選的回調函數. 與該事件不同, 如果服務器在關閉時未打開,則將使用錯誤作為唯一參數。

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關閉的時候觸發(fā). 注意,如果有連接存在, 直到所有的連接結束才會觸發(fā)這個事件

demo:

const net = require('net');
const server = new net.Server((c) => {
  // 'connection' listener
  c.write('hello');
});
server.on('close', () => {
 console.log('server 已關閉')
})
server.listen(8124, () => {
  console.log(server.listening);
});
server.close();
// server 已關閉

error 事件

說明:

當錯誤出現的時候觸發(fā).
不同于 net.Socket, ‘close' 事件不會在這個事件觸發(fā)后繼續(xù)觸發(fā)
除非 server.close() 是手動調用. 在 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,所以它能被讀或寫,并且它也是一個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:如果指定了該參數,則使用一個給定的文件描述符包裝一個已存在的 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)聽器。
最后一個參數 connectListener,如果指定了,將會被添加為 ‘connect' 事件的。
可能的用法:
socket.connect(options[, connectListener])
socket.connect(path[, connectListener]) 用于 IPC 連接。
socket.connect(port[, host][, connectListener]) 用于 TCP 。

socket.connect(options[, connectListener])

說明:

在給定的 socket 上初始化一個連接。
通常該方法是不需要的,應該使用 net.createConnection() 來創(chuàng)建和打開 socket。
一般只在實現一個自定義的 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 調用 socket.connect(options[, connectListener]) 方法。

socket.connect(port[, host][, connectListener])

說明:

在給定的 socket 上初始化一個 TCP 連接。
相當于使用 {port: port, host: host} 作為 options 調用 socket.connect(options[, connectListener]) 方法。

connect 事件

說明:

當一個 socket 連接成功建立的時候觸發(fā)該事件。

socket.connecting

說明:

該屬性如果為 true 則socket.connect(options[, connectListener]) 被調用但還未結束。
當發(fā)送 connect 事件或調用 socket.connect(options[, connectListener]) 的回調函數的時候會被設置為 false。

close 事件

說明:

一旦 socket 完全關閉就發(fā)出該事件。
參數 had_error 是 boolean 類型,表明 socket 被關閉是否取決于傳輸錯誤。

data 事件

說明:

當接收到數據的時觸發(fā)該事件。data 參數是一個 Buffer 或 String。
數據編碼由 socket.setEncoding() 設置。
注意:當 Socket 發(fā)送 data 事件的時候,如果沒有監(jiān)聽者數據將會丟失。

drain 事件

說明:

當寫入緩沖區(qū)變?yōu)榭諘r觸發(fā)。可以用來做上傳節(jié)流。

error 事件

說明:

當錯誤發(fā)生時觸發(fā)。'close' 事件也會緊接著該事件被觸發(fā)。

lookup 事件

說明:

在找到主機之后創(chuàng)建連接之前觸發(fā)。不可用于 UNIX socket。
參數:
err:錯誤對象。
address:IP地址
family:地址類型。
host:主機

timeout 事件

說明:

當 socket 超時的時候觸發(fā)。該事件只是用來通知 socket 已經閑置。用戶必須手動關閉。

socket.address()

說明:

返回操作系統(tǒng)報告的 socket 的地址、地址族和端口。
返回的對象有三個屬性,例如: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }

socket.bufferSize

說明:

net.Socket 具有該屬性,socket.write() 工作時需要。它可以幫助用戶快速啟動和運行。
計算機(處理速度)不能總是跟上 socket 的寫入速度 – 網絡連接可能太慢了。
Node.js 內部將維護一個寫入 socket 的數據隊列,并在可能的時候將數據發(fā)送出去。
(內部實現是對 socket 的文件描述符進行輪訓其是否是可寫狀態(tài)。)
使用內部緩沖的結果是可能造成內存的增長。此屬性顯示當前即將被寫入的緩沖的字符數。
(字符串的數目大致等于即將被寫入的字節(jié),但緩沖可能包含字符串,而字符串是惰性編碼的,所以實際的字節(jié)數是不知道的。)
對處理大量或持續(xù)增長的 bufferSize 有經驗的用戶應該注意使用 socket.pause() and socket.resume() 對他們程序中的數據流進行節(jié)流。

socket.bytesRead

說明:

接收的字節(jié)數量。

socket.bytesWritten

說明:

發(fā)送的字節(jié)數量。

socket.destroy([exception])

說明:

確保在該 socket 上不再有 I/O 活動。僅在出現錯誤的時候才需要(如解析錯誤等)。
如果制定了 exception,則將會觸發(fā)一個 ‘error' 事件,任何監(jiān)聽器都將接收到 exception 作為一個參數。

socket.destroyed

說明:

一個布爾值,用來指示連接是否已經被銷毀。一旦連接被銷毀就不能再使用它傳輸任何數據。

socket.end([data][, encoding])

說明:

半關閉 socket。例如發(fā)送一個 FIN 包。服務端仍可以發(fā)送數據。
如果指定了 data,則相當于調用 socket.write(data, encoding) 之后再調用 socket.end()。

end 事件

說明:

當 socket 的另一端發(fā)送一個 FIN 包的時候觸發(fā),從而結束 socket 的可讀端。
默認情況下(allowHalfOpen為false),socket 將發(fā)送一個 FIN 數據包,
并且一旦寫出它的等待寫入隊列就銷毀它的文件描述符。
當然,如果 allowHalfOpen 為 true,socket 就不會自動結束 end() 它的寫入端,允許用戶寫入任意數量的數據。
用戶必須調用 end() 顯示地結束這個連接(例如發(fā)送一個 FIN 數據包。)

socket.localAddress

說明:

遠程客戶端連接的本地 IP 地址字符串。
例如,一個服務端正在連接到 ‘0.0.0.0',客戶端連接到的是 ‘192.168.1.1',則 socket.localAddress 的值是 ‘192.168.1.1'。

socket.localPort

說明:

用數字表示的本地端口。例如 80 或 21。

socket.pause()

說明:

暫停讀寫數據。也就是說,'data' 將不會再被觸發(fā)。可以用于上傳節(jié)流

socket.resume()

說明:

在調用 socket.pause() 之后恢復讀取數據。

socket.unref()

說明:

如果活躍的 socket 是事件系統(tǒng)中僅存的 socket,則調用 unref 將會允許程序退出。
對一個已經調用了 unref 的 socket 再調用 unref 無效。

socket.ref()

說明:

與 unref 相反,在一個已經調用 unref 的 socket 中調用 ref,
如果 socket 是僅存的 socket,則程序不會退出(默認)。對一個已經調用 ref 的 socket 再次調用 ref 將不會再有效果。

socket.remoteAddress

說明:

用字符串表示的遠程 IP 地址。例如 ‘74.125.127.100' 或 ‘2001:4860:a005::68'。
如果 socket 被銷毀了(如客戶端已經失去連接)則其值為 undefined。

socket.remoteFamily

說明:

用字符串表示的遠程 IP 協(xié)議族。'IPv4′ 或 ‘IPv6'。

socket.remotePort

說明:

用數字表示的遠程端口。例如 80 或 21。

socket.setEncoding([encoding])

說明:

設置作為可讀流(Readable Stream)的編碼。

socket.setKeepAlive([enable][, initialDelay])

說明:

啟用/禁用長連接功能, 并且在第一個長連接探針被發(fā)送到一個空閑的 socket 之前可選則配置初始延遲。enable 默認為 false。
initialDelay(毫秒)用來設置接收到最后一個數據包和發(fā)送第一個長連接探針之間的延遲。
將 initialDelay 設置為 0,則會保持默認值(或之前設置的值)不變。默認是 0。

socket.setNoDelay([noDelay])

說明:

禁止 Nagle 。默認情況下 TCP 連接使用 Nagle 算法,在發(fā)送之前緩沖數據。
將 noDelay 設置為 true 將會在每次 socket.write() 被調用的時候立即發(fā)送數據。noDelay默認是 true。

socket.setTimeout(timeout[, callback])

說明:

當 socket 在 timeout 毫秒不活動之后將其設置為超時狀態(tài)。默認 net.Socket 沒有超時。
當一個閑置的超時被觸發(fā),socket 將會收到一個 ‘timeout' 事件,但連接不會被斷開。
用戶必須手動調用 socket.end() 或 socket.destroy() 來斷開連接。
如果 timeout 是 0,則存在的閑置超時將會被禁止。
可選的 callback 參數將會被當作一個時間監(jiān)聽器被添加到 ‘timeout' 事件。

socket.write(data[, encoding][, callback])

說明:

在 socket 上發(fā)送數據。第二個參數制定了字符串的編碼 – 默認是 UTF8 編碼。
如果全部數據都成功刷新到內核的緩沖則返回 true。
如果全部或部分數據在用戶內中排隊,則返回 false。當緩沖再次空閑的時候將觸發(fā) ‘drain' 事件。
當數據最終都被寫出之后,可選的 callback 參數將會被執(zhí)行 – 可能不會立即執(zhí)行。

看完上述內容,是不是對Node.js API中net模塊的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI