Node.js net模块详解

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' 事件)。
    javascript 复制代码
    const 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 对象。

    javascript 复制代码
    server.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' 事件)。
    javascript 复制代码
    const client = new net.Socket();
    client.connect(3000, '127.0.0.1', () => {
      console.log('Connected to server');
    });
  • socket.write(data[, encoding][, callback])

    发送数据到另一端。

    • data: 要发送的数据(BufferString)。
    • encoding: 字符串编码(默认 'utf8')。
    • callback: 数据写入完成后的回调。
  • socket.end([data][, encoding])

    半关闭连接(发送 FIN 包),可选发送最后一段数据。

  • socket.destroy()

    强制销毁连接,触发 'close' 事件。

  • socket.pause() / socket.resume()

    暂停/恢复接收数据(控制 'data' 事件触发)。

  • socket.setTimeout(timeout[, callback])

    设置连接超时时间(毫秒),超时后触发回调并自动销毁连接。

    javascript 复制代码
    socket.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'

    接收到数据时触发,回调参数为 BufferString

    javascript 复制代码
    socket.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')

    javascript 复制代码
    const server = net.createServer((socket) => {
      socket.write('Welcome to the server!');
    });
  • net.connect(port[, host][, connectListener])

    创建客户端并连接到服务器,返回 net.Socket 对象。

    javascript 复制代码
    const client = net.connect(3000, 'localhost', () => {
      client.write('Hello from client!');
    });
  • net.isIP(input)

    判断输入是否为 IP 地址,返回 4(IPv4)、6(IPv6)或 0(无效)。

    javascript 复制代码
    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 服务器
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. 关键注意事项

  1. 错误处理 :始终监听 'error' 事件,避免进程崩溃。
  2. 数据流控制 :使用 pause()resume() 管理大数据流。
  3. 连接超时 :通过 setTimeout 防止僵死连接。
  4. IPC 路径:Unix 系统下 IPC 需确保路径可写,Windows 不支持。

通过掌握这些 API,可以构建高效的 TCP 服务器和客户端,适用于实时通信、微服务等场景。

相关推荐
橘右溪12 分钟前
Node.js中fs模块详解
node.js
混血哲谈3 小时前
全新电脑如何快速安装nvm,npm,pnpm
前端·npm·node.js
魔云连洲6 小时前
用Webpack 基础配置快速搭建项目开发环境
前端·webpack·node.js
石页玩逆向6 小时前
某企查-某度旋转验证码V2算法分析
node.js
·薯条大王7 小时前
Node.js 模块包的管理和使用是
node.js
熊猫片沃子9 小时前
使用nvm解决nodejs多版本问题,难道不香吗?
前端·npm·node.js
Mintopia9 小时前
Node.js 与前端现代工具链进阶指南
前端·javascript·node.js
孟陬11 小时前
Node.js 如何检测 script 脚本是在项目本身运行
node.js·bun
玲小珑13 小时前
5分钟学会LLM开发系列教程(五)Agent的最终形态LangGraph
langchain·node.js·ai编程
林太白14 小时前
Nest如何连接数据库
前端·后端·node.js