Node.js 的 net
模块用于创建低层次的 TCP 或 IPC 服务器和客户端,它为 Node.js 应用提供了与操作系统网络相关的功能,可以用来处理原始套接字通信。本文将详细介绍 net
模块的所有属性、方法以及使用方式,并涵盖它的相关功能。
net
模块是 Node.js 的内置模块,因此无需安装任何额外的库,只需通过 require('net')
来引入即可。
const net = require('net');
net.createServer()
net.createServer()
用于创建一个 TCP 服务器对象。它接收一个回调函数,当新的连接到达时,该回调函数将被调用,并传递一个 socket
对象,代表与客户端之间的连接。
const server = net.createServer((socket) => {
console.log('客户端连接');
// 处理来自客户端的数据
socket.on('data', (data) => {
console.log(`客户端发送的数据: ${data}`);
});
// 处理客户端断开连接
socket.on('end', () => {
console.log('客户端断开连接');
});
// 向客户端发送数据
socket.write('欢迎连接到服务器!\n');
});
server.listen()
server.listen()
启动服务器监听指定的端口和主机名。可以使用 server.listen()
来启动服务器,并开始接受连接。
server.listen(8080, '127.0.0.1', () => {
console.log('服务器已启动,正在监听 127.0.0.1:8080');
});
也可以仅传递端口号,默认监听所有可用的网络接口。
server.listen(8080, () => {
console.log('服务器正在监听端口 8080');
});
server.close()
server.close()
关闭服务器,停止接受新连接,并等待现有连接结束。
server.close(() => {
console.log('服务器已关闭');
});
connection
, close
, error
connection
: 每当有新客户端连接时触发。close
: 当服务器关闭时触发。error
: 当发生错误时触发。server.on('connection', (socket) => {
console.log('新连接到达');
});
server.on('error', (err) => {
console.error('服务器发生错误:', err);
});
net.connect()
net.connect()
(或 net.createConnection()
)用于创建 TCP 客户端,并连接到指定的服务器。
const client = net.connect({ port: 8080, host: '127.0.0.1' }, () => {
console.log('已连接到服务器');
client.write('你好,服务器!');
});
client.write()
client.write()
用于向服务器发送数据。可以通过该方法发送字符串或缓冲区数据。
client.write('发送一些数据到服务器');
client.end()
client.end()
用于关闭与服务器的连接。可以在发送最后一条消息后调用 end()
,告诉服务器不再发送任何数据。
client.end('再见,服务器');
data
, end
, error
data
: 每当接收到服务器的数据时触发。end
: 当服务器关闭连接时触发。error
: 当连接发生错误时触发。client.on('data', (data) => {
console.log(`接收到服务器数据: ${data}`);
});
client.on('end', () => {
console.log('已断开与服务器的连接');
});
client.on('error', (err) => {
console.error('发生错误:', err);
});
net.Socket
对象表示与远程主机的 TCP 连接,既可用于客户端,也可用于服务器端的连接。
socket.write()
socket.write()
用于通过套接字发送数据。可以发送字符串或缓冲区数据。
socket.write('发送数据到客户端或服务器');
socket.end()
socket.end()
用于关闭套接字。可以在发送完所有数据后调用此方法。
socket.end('关闭连接并发送最后一条消息');
socket.setTimeout()
socket.setTimeout()
用于设置超时时间(以毫秒为单位)。如果在超时期间没有活动,套接字将触发 timeout
事件。
socket.setTimeout(5000); // 5 秒后触发 timeout
socket.on('timeout', () => {
console.log('连接超时');
socket.end();
});
data
, end
, timeout
data
: 每当接收到数据时触发。end
: 当连接结束时触发。timeout
: 当连接超时时触发。socket.on('data', (data) => {
console.log(`收到的数据: ${data}`);
});
socket.on('end', () => {
console.log('连接已关闭');
});
socket.on('timeout', () => {
console.log('连接超时');
});
Node.js 的 net
模块支持 IPC (Inter-Process Communication,进程间通信),可以通过 UNIX 套接字或 Windows 命名管道进行进程间通信。
net.createServer()
和 net.connect()
用于 IPC创建 IPC 服务器时,使用文件路径(UNIX)或命名管道(Windows)作为地址。
// 服务器端
const server = net.createServer((socket) => {
console.log('IPC 客户端连接');
socket.write('欢迎到 IPC 服务器');
});
server.listen('/tmp/echo.sock'); // 在 UNIX 系统中
客户端连接到相同的路径:
// 客户端
const client = net.connect('/tmp/echo.sock', () => {
console.log('已连接到 IPC 服务器');
client.write('你好,IPC 服务器');
});
在使用 net
模块时,错误处理至关重要。确保在服务器和客户端中都添加对 error
事件的处理程序,防止未处理的异常导致应用崩溃。
server.on('error', (err) => {
console.error('服务器发生错误:', err);
});
client.on('error', (err) => {
console.error('客户端发生错误:', err);
});
对于客户端而言,连接到服务器失败时,可以实现重试逻辑。
function connectToServer() {
const client = net.connect({ port: 8080 }, () => {
console.log('已连接到服务器');
});
client.on('error', (err) => {
console.error('连接失败,重试中...', err);
setTimeout(connectToServer, 5000); // 5 秒后重试
});
}
connectToServer();
const net = require('net');
const server = net.createServer((socket) => {
console.log('新客户端连接');
socket.on('data', (data) => {
console.log(`客户端发送的数据: ${data}`);
socket.write('已收到');
});
socket.on('end', () => {
console.log('客户端断开连接');
});
socket.write('欢迎连接到服务器!\n');
});
server.listen(8080, () => {
console.log('服务器正在监听端口 8080');
});
const net = require('net');
const client = net.connect({ port: 8080 }, () => {
console.log('已连接到服务器');
client.write('你好,服务器!');
});
client.on('data', (data) => {
console.log(`接收到的数据: ${data}`);
client.end();
});
client.on('end', () => {
console.log('已断开与服务器的连接');
});
net
模块是 Node.js 中用于处理 TCP 或 IPC 连接的强大工具。它提供了服务器和客户端之间的低层网络通信能力,适合处理实时数据传输、聊天室应用、流式数据传输等任务。通过结合事件驱动机制和套接字对象,开发者可以轻松构建高效的网络应用。