Node.js net模塊詳解(含類、方法、事件)
Node.js 的 net
模塊提供了基于 TCP 或 IPC 的網(wǎng)絡(luò)通信能力,用于創(chuàng)建服務(wù)器和客戶端。以下是 net
模塊的核心 API 詳解,包含類、方法、事件及示例。
1. 模塊引入
const net = require('net');
2. 核心類與方法
2.1 net.Server 類
用于創(chuàng)建 TCP 或 IPC 服務(wù)器。
方法
server.listen(port[, host][, backlog][, callback])
監(jiān)聽(tīng)指定端口和主機(jī)。
port
: 端口號(hào)(若為 IPC 服務(wù)器則忽略)。host
: 主機(jī)地址(默認(rèn)'localhost'
)。backlog
: 最大等待連接隊(duì)列長(zhǎng)度(默認(rèn)由系統(tǒng)決定)。callback
: 監(jiān)聽(tīng)成功后的回調(diào)(等效于監(jiān)聽(tīng)'listening'
事件)。
const server = net.createServer(); server.listen(3000, '127.0.0.1', () => { console.log('Server listening on port 3000'); });
server.listen(path[, callback])
監(jiān)聽(tīng) IPC 路徑(僅 Unix 系統(tǒng)支持)。
path
: IPC 文件路徑(如'/tmp/echo.sock'
)。
server.close([callback])
停止服務(wù)器接受新連接,關(guān)閉現(xiàn)有連接后觸發(fā)回調(diào)。
server.address()
返回服務(wù)器綁定的地址信息({ port, address, family }
),未監(jiān)聽(tīng)時(shí)返回 null
。
事件
'connection'
當(dāng)有新客戶端連接時(shí)觸發(fā),回調(diào)參數(shù)為 socket
對(duì)象。
server.on('connection', (socket) => { console.log('New client connected'); });
'listening'
服務(wù)器開(kāi)始監(jiān)聽(tīng)時(shí)觸發(fā)。
'close'
服務(wù)器關(guān)閉后觸發(fā)。
'error'
發(fā)生錯(cuò)誤時(shí)觸發(fā)(如端口被占用)。
2.2 net.Socket 類
表示 TCP 或 IPC 的客戶端或服務(wù)器端連接。
方法
socket.connect(port[, host][, connectListener])
連接到指定端口和主機(jī)。
port
: 目標(biāo)端口。host
: 目標(biāo)主機(jī)(默認(rèn)'localhost'
)。connectListener
: 連接成功后的回調(diào)(等效于監(jiān)聽(tīng)'connect'
事件)。
const client = new net.Socket(); client.connect(3000, '127.0.0.1', () => { console.log('Connected to server'); });
socket.write(data[, encoding][, callback])
發(fā)送數(shù)據(jù)到另一端。
data
: 要發(fā)送的數(shù)據(jù)(Buffer
或String
)。encoding
: 字符串編碼(默認(rèn)'utf8'
)。callback
: 數(shù)據(jù)寫(xiě)入完成后的回調(diào)。
socket.end([data][, encoding])
半關(guān)閉連接(發(fā)送 FIN 包),可選發(fā)送最后一段數(shù)據(jù)。
socket.destroy()
強(qiáng)制銷毀連接,觸發(fā) 'close'
事件。
socket.pause()
/ socket.resume()
暫停/恢復(fù)接收數(shù)據(jù)(控制 'data'
事件觸發(fā))。
socket.setTimeout(timeout[, callback])
設(shè)置連接超時(shí)時(shí)間(毫秒),超時(shí)后觸發(fā)回調(diào)并自動(dòng)銷毀連接。
socket.setTimeout(3000, () => { console.log('Socket timed out'); socket.destroy(); });
socket.setNoDelay([noDelay])
禁用 Nagle 算法(noDelay=true
),降低延遲,適用于高頻小數(shù)據(jù)包場(chǎng)景。
屬性
socket.localAddress
/socket.localPort
: 本地地址和端口。socket.remoteAddress
/socket.remotePort
: 遠(yuǎn)程地址和端口。socket.bytesRead
/socket.bytesWritten
: 讀取/寫(xiě)入的字節(jié)數(shù)。
事件
'data'
接收到數(shù)據(jù)時(shí)觸發(fā),回調(diào)參數(shù)為 Buffer
或 String
。
socket.on('data', (data) => { console.log('Received:', data.toString()); });
'connect'
連接成功建立時(shí)觸發(fā)。
'end'
另一端發(fā)送 FIN 包(結(jié)束連接)時(shí)觸發(fā)。
'close'
連接完全關(guān)閉后觸發(fā)。
'timeout'
連接超時(shí)時(shí)觸發(fā)(需配合 setTimeout
使用)。
'error'
發(fā)生錯(cuò)誤時(shí)觸發(fā)(如連接被重置)。
2.3 工具函數(shù)
net.createServer([options][, connectionListener])
快速創(chuàng)建服務(wù)器,等同于 new net.Server()
+ server.on('connection')
。
const server = net.createServer((socket) => { socket.write('Welcome to the server!'); });
net.connect(port[, host][, connectListener])
創(chuàng)建客戶端并連接到服務(wù)器,返回 net.Socket
對(duì)象。
const client = net.connect(3000, 'localhost', () => { client.write('Hello from client!'); });
net.isIP(input)
判斷輸入是否為 IP 地址,返回 4
(IPv4)、6
(IPv6)或 0
(無(wú)效)。
net.isIP('192.168.1.1'); // 4 net.isIP('::1'); // 6 net.isIP('hello'); // 0
net.isIPv4(input)
/ net.isIPv6(input)
判斷輸入是否為 IPv4 或 IPv6 地址,返回布爾值。
3. 完整示例 TCP 服務(wù)器
const net = require('net'); const server = net.createServer((socket) => { console.log('Client connected'); socket.on('data', (data) => { console.log('Received:', data.toString()); socket.write('Echo: ' + data); }); socket.on('end', () => { console.log('Client disconnected'); }); }); server.listen(3000, '127.0.0.1', () => { console.log('Server listening on port 3000'); });
TCP 客戶端
const net = require('net'); const client = net.connect(3000, '127.0.0.1', () => { client.write('Hello Server!'); }); client.on('data', (data) => { console.log('Server response:', data.toString()); client.end(); }); client.on('end', () => { console.log('Disconnected from server'); });
4. 關(guān)鍵注意事項(xiàng)
- 錯(cuò)誤處理:始終監(jiān)聽(tīng)
'error'
事件,避免進(jìn)程崩潰。 - 數(shù)據(jù)流控制:使用
pause()
和resume()
管理大數(shù)據(jù)流。 - 連接超時(shí):通過(guò)
setTimeout
防止僵死連接。 - IPC 路徑:Unix 系統(tǒng)下 IPC 需確保路徑可寫(xiě),Windows 不支持。
通過(guò)掌握這些 API,可以構(gòu)建高效的 TCP 服務(wù)器和客戶端,適用于實(shí)時(shí)通信、微服務(wù)等場(chǎng)景。
到此這篇關(guān)于Node.js net模塊詳解的文章就介紹到這了,更多相關(guān)Node.js net模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nodejs實(shí)現(xiàn)定時(shí)爬蟲(chóng)的完整實(shí)例
這篇文章主要給大家介紹了關(guān)于Nodejs實(shí)現(xiàn)定時(shí)爬蟲(chóng)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03淺析Node.js實(shí)現(xiàn)HTTP文件下載
本文介紹如何用Node.js來(lái)實(shí)現(xiàn)HTTP文件下載,文章以實(shí)例演示所以很詳細(xì),有需要的小伙伴們可以參考學(xué)習(xí)。2016-08-08vscode無(wú)法運(yùn)行npm命令的問(wèn)題解決(cmd可行)
本文主要介紹了vscode無(wú)法運(yùn)行npm命令的問(wèn)題解決(cmd可行),VSCode無(wú)法調(diào)用npm可能是因?yàn)榄h(huán)境路徑配置錯(cuò)誤,下面就來(lái)具體介紹一下原因及解決方法,感興趣的可以了解一下2024-04-04NodeJs爬蟲(chóng)框架Spider基礎(chǔ)使用教程
這篇文章主要為大家介紹了NodeJs爬蟲(chóng)框架Spider基礎(chǔ)使用教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07node.js對(duì)應(yīng)npm安裝和使用方法教程
這篇文章主要給大家介紹了關(guān)于node.js對(duì)應(yīng)npm安裝和使用方法的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用node.js具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01nodejs 實(shí)現(xiàn)模擬form表單上傳文件
使用nodejs來(lái)模擬form表單進(jìn)行文件上傳,可以同時(shí)上傳多個(gè)文件。2014-07-07