Node.js 的 net 模块提供了基于 TCP 或 IPC 的网络通信能力,用于创建服务器和客户端。以下是 net 模块的核心 API 详解,包含类、方法、事件及示例。
1. 模块引入
javascript
const net = require('net');
2. 核心类与方法
2.1 net.Server 类
用于创建 TCP 或 IPC 服务器。
方法
-
server.listen(port[, host][, backlog][, callback])监听指定端口和主机。
port: 端口号(若为 IPC 服务器则忽略)。host: 主机地址(默认'localhost')。backlog: 最大等待连接队列长度(默认由系统决定)。callback: 监听成功后的回调(等效于监听'listening'事件)。
javascriptconst server = net.createServer(); server.listen(3000, '127.0.0.1', () => { console.log('Server listening on port 3000'); }); -
server.listen(path[, callback])监听 IPC 路径(仅 Unix 系统支持)。
path: IPC 文件路径(如'/tmp/echo.sock')。
-
server.close([callback])停止服务器接受新连接,关闭现有连接后触发回调。
-
server.address()返回服务器绑定的地址信息(
{ port, address, family }),未监听时返回null。
事件
-
'connection'当有新客户端连接时触发,回调参数为
socket对象。javascriptserver.on('connection', (socket) => { console.log('New client connected'); }); -
'listening'服务器开始监听时触发。
-
'close'服务器关闭后触发。
-
'error'发生错误时触发(如端口被占用)。
2.2 net.Socket 类
表示 TCP 或 IPC 的客户端或服务器端连接。
方法
-
socket.connect(port[, host][, connectListener])连接到指定端口和主机。
port: 目标端口。host: 目标主机(默认'localhost')。connectListener: 连接成功后的回调(等效于监听'connect'事件)。
javascriptconst client = new net.Socket(); client.connect(3000, '127.0.0.1', () => { console.log('Connected to server'); }); -
socket.write(data[, encoding][, callback])发送数据到另一端。
data: 要发送的数据(Buffer或String)。encoding: 字符串编码(默认'utf8')。callback: 数据写入完成后的回调。
-
socket.end([data][, encoding])半关闭连接(发送 FIN 包),可选发送最后一段数据。
-
socket.destroy()强制销毁连接,触发
'close'事件。 -
socket.pause()/socket.resume()暂停/恢复接收数据(控制
'data'事件触发)。 -
socket.setTimeout(timeout[, callback])设置连接超时时间(毫秒),超时后触发回调并自动销毁连接。
javascriptsocket.setTimeout(3000, () => { console.log('Socket timed out'); socket.destroy(); }); -
socket.setNoDelay([noDelay])禁用 Nagle 算法(
noDelay=true),降低延迟,适用于高频小数据包场景。
属性
socket.localAddress/socket.localPort: 本地地址和端口。socket.remoteAddress/socket.remotePort: 远程地址和端口。socket.bytesRead/socket.bytesWritten: 读取/写入的字节数。
事件
-
'data'接收到数据时触发,回调参数为
Buffer或String。javascriptsocket.on('data', (data) => { console.log('Received:', data.toString()); }); -
'connect'连接成功建立时触发。
-
'end'另一端发送 FIN 包(结束连接)时触发。
-
'close'连接完全关闭后触发。
-
'timeout'连接超时时触发(需配合
setTimeout使用)。 -
'error'发生错误时触发(如连接被重置)。
2.3 工具函数
-
net.createServer([options][, connectionListener])快速创建服务器,等同于
new net.Server()+server.on('connection')。javascriptconst server = net.createServer((socket) => { socket.write('Welcome to the server!'); }); -
net.connect(port[, host][, connectListener])创建客户端并连接到服务器,返回
net.Socket对象。javascriptconst client = net.connect(3000, 'localhost', () => { client.write('Hello from client!'); }); -
net.isIP(input)判断输入是否为 IP 地址,返回
4(IPv4)、6(IPv6)或0(无效)。javascriptnet.isIP('192.168.1.1'); // 4 net.isIP('::1'); // 6 net.isIP('hello'); // 0 -
net.isIPv4(input)/net.isIPv6(input)判断输入是否为 IPv4 或 IPv6 地址,返回布尔值。
3. 完整示例
TCP 服务器
javascript
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 客户端
javascript
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. 关键注意事项
- 错误处理 :始终监听
'error'事件,避免进程崩溃。 - 数据流控制 :使用
pause()和resume()管理大数据流。 - 连接超时 :通过
setTimeout防止僵死连接。 - IPC 路径:Unix 系统下 IPC 需确保路径可写,Windows 不支持。
通过掌握这些 API,可以构建高效的 TCP 服务器和客户端,适用于实时通信、微服务等场景。