您好,登錄后才能下訂單哦!
這篇文章主要講解了Node.js API中net模塊的用法,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。
net 模塊提供了創建基于流的 TCP 或 IPC 服務器(net.createServer())和客戶端(net.createConnection()) 的異步網絡 API。
通過以下方式引入:
const net = require('net');
說明:
測試 input 是否是 IP 地址。無效的字符串則返回 0,IPv4 地址則返回 4,IPv6的地址則返回 6。
demo:
const net = require('net'); console.log( net.isIP('127.0.0.1') ); // 4
說明:
如果 input 是 IPv4 地址則返回 true,否則返回 false。
demo:
const net = require('net'); console.log( net.isIPv4('127.0.0.1') ); // true
說明:
如果 input 是 IPv6 地址則返回 true,否則返回 false。
demo:
const net = require('net'); console.log( net.isIPv6('127.0.0.1') ); // false
說明:
創建一個新的TCP或IPC服務。
options:
allowHalfOpen: 表示是否允許一個半開的TCP連接。 默認值: false
pauseOnConnect:一旦來了連接,是否暫停套接字。 默認值: false
connectionListener:事件自動設置一個監聽器。
如果 allowHalfOpen 被設置為true, 那么當socket.end() 被顯式調用時,
如果對邊套接字發送了一個FIN包,服務只會返回一個FIN數據包, 這會持續到后來連接處在半閉狀態 (不可讀但是可寫)。
如果 pauseOnConnect 被設置為 true, 那么與連接相關的套接字都會暫停,也不會從套接字句柄讀取數據。
這樣就允許連接在進程之間傳遞,避免數據被最初的進程讀取。 如果想從一個暫停的套接字開始讀數據,請調用socket.resume()
服務可以是一個TCP服務或者一個 IPC 服務, 這取決于listen() 監聽什么
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.Socket 的工廠函數,立即使用 socket.connect() 初始化鏈接,然后返回啟動連接的 net.Socket。
當連接建立之后,在返回的 socket 上將觸發一個 ‘connect' 事件。
若制定了最后一個參數 connectListener,則它將會被添加到 ‘connect' 事件作為一個監聽器。
注意: net.connect() 函數也是該函數的別名。
說明:
與net.createConnection()功能一致。
connectListener:如果傳遞該參數,將被添加為返回 socket 上的 ‘connect' 事件上的監聽器。
注意: 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' });
說明:
初始化一個 IPC 連接。
該方法使用所有默認選項創建一個新的 net.Socket,
使用 socket.connect(path[, connectListener]) 立即初始化連接,然后返回初始化連接的 net.Socket。
path: Socket 應該被連接到的路徑。
注意: net.connect(path[, connectListener]) 函數也是該函數的別名。
說明:
初始化一個TCP連接
這個函數用默認配置創建一個新的net.Socket,
然后socket.connect(port[, host][, connectListener])初始化一個連接,并返回開啟連接的那個 net.Socket。
注意: net.connect(port[, host][, connectListener]) 函數也是該函數的別名。
說明:
這個類用于創建 TCP 或 IPC server。
說明:
創建一個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'); });
說明:
為 connections 啟動一個 server 監聽.
一個 net.Server 可以是一個 TCP 或者 一個 IPC server,這取決于它監聽什么。
可能的參數:
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 開始監聽,'listening' 事件會觸發。
最后一個參數 callback 將會被添加為'listening' 事件的監聽器。
監聽時,其中一個最常見的錯誤是 EADDRINUSE。這是因為另一個 server 已經監聽了該請求中的 port / path / handle。
說明:
啟動一個服務器,監聽已經綁定到端口、UNIX 域套接字或 Windows 命名管道的給定句柄上的連接。
句柄對象可以是服務器、套接字(任何具有底層 _handle 成員的東西),
也可以是具有 fd 成員的對象,該成員是一個有效的文件描述符。
注意:在Windows上不支持在文件描述符上進行監聽。
說明:
啟動一個TCP服務監聽輸入的port和host。
options:必須。支持以下參數屬性:
port:端口
host:主機
path:如果指定了 port 參數則會被忽略。
如果指定了 port 參數,該方法的行為跟 server.listen([port][, hostname][, backlog][, callback]) 一樣。
否則,如果指定了 path 參數,該方法的行為與 server.listen(path[, backlog][, callback]) 一致。
如果沒有 port 或者 path 參數,則會拋出一個錯誤。
說明:
啟動一個 IPC 服務器監聽給定 path 的連接。
path:服務器需要監聽的路徑
說明:
啟動一個TCP服務監聽輸入的port和host。
如果port省略或是0,系統會隨意分配一個在'listening'事件觸發后能被server.address().port檢索的無用端口。
說明:
一個布爾值, 表明 server 是否正在監聽連接
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
說明:
當服務被綁定后調用
demo:
const net = require('net'); const server = new net.Server((c) => { // 'connection' listener c.write('hello'); }); server.on('listening', () => { console.log('開始監聽'); }); server.listen(8124, () => { console.log(server.listening); }); // 開始監聽
說明:
如果在IP socket上監聽,則返回綁定的ip地址, 地址族和操作系統報告的服務端口
在找到操作系統分配的地址時,找到指定的端口是有用的.
返回一個有 port, family, 和 address 屬性: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }的對象
對于在管道或UNIX域套接字上偵聽的server,該名稱將返回為字符串
只有到了 ‘listening' 事件被觸發時候.才可以調用 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 連接數過多時拒絕連接。
一旦將一個 socket 發送給 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); });
說明:
異步獲取服務器的當前并發連接數。當 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
說明:
獲取服務器的當前并發連接數。
說明:
當一個新的connection建立的時候觸發. 傳遞一個 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在事件系統中是唯一有效的,那么對server調用unref將允許程序退出。
如果這個server已經調用過unref那么再次調用將不會再有效果。
說明:
在一個已經調用 unref 的 server 中調用 ref,如果 server 是僅存的 server,則程序不會退出(默認)。
對一個已經調用 ref 的 server 再次調用 ref 將不會再有效果。
說明:
停止 server接受建立新的connections并保持已經存在的connections.
此功能是異步的,當所有的connections關閉同時server響應 ‘close'事件的時候,server將會最終關閉.
一旦'close'發生將會調用可選的回調函數. 與該事件不同, 如果服務器在關閉時未打開,則將使用錯誤作為唯一參數。
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();
說明:
當server關閉的時候觸發. 注意,如果有連接存在, 直到所有的連接結束才會觸發這個事件
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 已關閉
說明:
當錯誤出現的時候觸發.
不同于 net.Socket, ‘close' 事件不會在這個事件觸發后繼續觸發
除非 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('發生異常', err); }) server.listen(8124, () => { console.log(server.listening); });
說明:
這個類是 TCP 或 UNIX Socket 的抽象(在Windows上使用命名管道,而UNIX使用域套接字)。
一個net.Socket也是一個duplex stream,所以它能被讀或寫,并且它也是一個EventEmitter。
net.Socket可以被用戶創建并直接與server通信。
舉個例子,它是通過net.createConnection()返回的,所以用戶可以使用它來與server通信。
當一個連接被接收時,它也能被Node.js創建并傳遞給用戶。
比如,它是通過監聽在一個net.Server上的'connection'事件觸發而獲得的,那么用戶可以使用它來與客戶端通信。
說明:
創建一個 socket 對象。
options:
fd:如果指定了該參數,則使用一個給定的文件描述符包裝一個已存在的 socket,否則將創建一個新的 socket。
allowHalfOpen:指示是否允許半打開的 TCP 連接。默認是 false。
readable:當傳遞了 fd 時允許讀取 socket,否則忽略。默認 false。
writable:當傳遞了 fd 時允許寫入 socket,否則忽略。默認 false。
新創建的 socket 可以是 TCP socket 也可以是 IPC 端點流,取決于它連接 connect() 到什么。
說明:
在給定的套接字上啟動一個連接。
該方法是異步的。當連接建立了的時候,'connect' 事件將會被觸發。
如果連接過程中有問題,'error' 事件將會代替 ‘connect' 事件被觸發,并將錯誤信息傳遞給 ‘error' 監聽器。
最后一個參數 connectListener,如果指定了,將會被添加為 ‘connect' 事件的。
可能的用法:
socket.connect(options[, connectListener])
socket.connect(path[, connectListener]) 用于 IPC 連接。
socket.connect(port[, host][, connectListener]) 用于 TCP 。
說明:
在給定的 socket 上初始化一個連接。
通常該方法是不需要的,應該使用 net.createConnection() 來創建和打開 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 必須。客戶端連接的路徑。
說明:
在給定的 socket 上初始化 IPC 。
相當使用 { path: path } 作為 options 調用 socket.connect(options[, connectListener]) 方法。
說明:
在給定的 socket 上初始化一個 TCP 連接。
相當于使用 {port: port, host: host} 作為 options 調用 socket.connect(options[, connectListener]) 方法。
說明:
當一個 socket 連接成功建立的時候觸發該事件。
說明:
該屬性如果為 true 則socket.connect(options[, connectListener]) 被調用但還未結束。
當發送 connect 事件或調用 socket.connect(options[, connectListener]) 的回調函數的時候會被設置為 false。
說明:
一旦 socket 完全關閉就發出該事件。
參數 had_error 是 boolean 類型,表明 socket 被關閉是否取決于傳輸錯誤。
說明:
當接收到數據的時觸發該事件。data 參數是一個 Buffer 或 String。
數據編碼由 socket.setEncoding() 設置。
注意:當 Socket 發送 data 事件的時候,如果沒有監聽者數據將會丟失。
說明:
當寫入緩沖區變為空時觸發。可以用來做上傳節流。
說明:
當錯誤發生時觸發。'close' 事件也會緊接著該事件被觸發。
說明:
在找到主機之后創建連接之前觸發。不可用于 UNIX socket。
參數:
err:錯誤對象。
address:IP地址
family:地址類型。
host:主機
說明:
當 socket 超時的時候觸發。該事件只是用來通知 socket 已經閑置。用戶必須手動關閉。
說明:
返回操作系統報告的 socket 的地址、地址族和端口。
返回的對象有三個屬性,例如: { port: 12346, family: ‘IPv4', address: ‘127.0.0.1' }
說明:
net.Socket 具有該屬性,socket.write() 工作時需要。它可以幫助用戶快速啟動和運行。
計算機(處理速度)不能總是跟上 socket 的寫入速度 – 網絡連接可能太慢了。
Node.js 內部將維護一個寫入 socket 的數據隊列,并在可能的時候將數據發送出去。
(內部實現是對 socket 的文件描述符進行輪訓其是否是可寫狀態。)
使用內部緩沖的結果是可能造成內存的增長。此屬性顯示當前即將被寫入的緩沖的字符數。
(字符串的數目大致等于即將被寫入的字節,但緩沖可能包含字符串,而字符串是惰性編碼的,所以實際的字節數是不知道的。)
對處理大量或持續增長的 bufferSize 有經驗的用戶應該注意使用 socket.pause() and socket.resume() 對他們程序中的數據流進行節流。
說明:
接收的字節數量。
說明:
發送的字節數量。
說明:
確保在該 socket 上不再有 I/O 活動。僅在出現錯誤的時候才需要(如解析錯誤等)。
如果制定了 exception,則將會觸發一個 ‘error' 事件,任何監聽器都將接收到 exception 作為一個參數。
說明:
一個布爾值,用來指示連接是否已經被銷毀。一旦連接被銷毀就不能再使用它傳輸任何數據。
說明:
半關閉 socket。例如發送一個 FIN 包。服務端仍可以發送數據。
如果指定了 data,則相當于調用 socket.write(data, encoding) 之后再調用 socket.end()。
說明:
當 socket 的另一端發送一個 FIN 包的時候觸發,從而結束 socket 的可讀端。
默認情況下(allowHalfOpen為false),socket 將發送一個 FIN 數據包,
并且一旦寫出它的等待寫入隊列就銷毀它的文件描述符。
當然,如果 allowHalfOpen 為 true,socket 就不會自動結束 end() 它的寫入端,允許用戶寫入任意數量的數據。
用戶必須調用 end() 顯示地結束這個連接(例如發送一個 FIN 數據包。)
說明:
遠程客戶端連接的本地 IP 地址字符串。
例如,一個服務端正在連接到 ‘0.0.0.0',客戶端連接到的是 ‘192.168.1.1',則 socket.localAddress 的值是 ‘192.168.1.1'。
說明:
用數字表示的本地端口。例如 80 或 21。
說明:
暫停讀寫數據。也就是說,'data' 將不會再被觸發。可以用于上傳節流
說明:
在調用 socket.pause() 之后恢復讀取數據。
說明:
如果活躍的 socket 是事件系統中僅存的 socket,則調用 unref 將會允許程序退出。
對一個已經調用了 unref 的 socket 再調用 unref 無效。
說明:
與 unref 相反,在一個已經調用 unref 的 socket 中調用 ref,
如果 socket 是僅存的 socket,則程序不會退出(默認)。對一個已經調用 ref 的 socket 再次調用 ref 將不會再有效果。
說明:
用字符串表示的遠程 IP 地址。例如 ‘74.125.127.100' 或 ‘2001:4860:a005::68'。
如果 socket 被銷毀了(如客戶端已經失去連接)則其值為 undefined。
說明:
用字符串表示的遠程 IP 協議族。'IPv4′ 或 ‘IPv6'。
說明:
用數字表示的遠程端口。例如 80 或 21。
說明:
設置作為可讀流(Readable Stream)的編碼。
說明:
啟用/禁用長連接功能, 并且在第一個長連接探針被發送到一個空閑的 socket 之前可選則配置初始延遲。enable 默認為 false。
initialDelay(毫秒)用來設置接收到最后一個數據包和發送第一個長連接探針之間的延遲。
將 initialDelay 設置為 0,則會保持默認值(或之前設置的值)不變。默認是 0。
說明:
禁止 Nagle 。默認情況下 TCP 連接使用 Nagle 算法,在發送之前緩沖數據。
將 noDelay 設置為 true 將會在每次 socket.write() 被調用的時候立即發送數據。noDelay默認是 true。
說明:
當 socket 在 timeout 毫秒不活動之后將其設置為超時狀態。默認 net.Socket 沒有超時。
當一個閑置的超時被觸發,socket 將會收到一個 ‘timeout' 事件,但連接不會被斷開。
用戶必須手動調用 socket.end() 或 socket.destroy() 來斷開連接。
如果 timeout 是 0,則存在的閑置超時將會被禁止。
可選的 callback 參數將會被當作一個時間監聽器被添加到 ‘timeout' 事件。
說明:
在 socket 上發送數據。第二個參數制定了字符串的編碼 – 默認是 UTF8 編碼。
如果全部數據都成功刷新到內核的緩沖則返回 true。
如果全部或部分數據在用戶內中排隊,則返回 false。當緩沖再次空閑的時候將觸發 ‘drain' 事件。
當數據最終都被寫出之后,可選的 callback 參數將會被執行 – 可能不會立即執行。
看完上述內容,是不是對Node.js API中net模塊的用法有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。