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: 要发送的数据(Buffer 或 String)。
    • 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'

    接收到数据时触发,回调参数为 Buffer 或 String。

    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 服务器和客户端,适用于实时通信、微服务等场景。

相关推荐
YIAN6 小时前
从 SSE 流式到结构化输出:LangChain 三大 OutputParser 与 ToolCall 方案全实战
前端·langchain·node.js
濮水大叔13 小时前
Cabloy全栈框架的两个SSR入口:Vona集成式SSR vs Zova独立式SSR
typescript·node.js·全栈
怕浪猫13 小时前
DeepSeek Harness 系列图解
面试·前端框架·node.js
百万蹄蹄向前冲13 小时前
双端同步!云服务器装最新Node.js v26.10全过程追踪
服务器·人工智能·node.js
前端snow13 小时前
ai agent--- 后端概念补充:Docker Compose、ElasticSearch、IK、BM25等
node.js
EdgeEcho13 小时前
Node 里那个"只解第一帧"的坑,我用 172 行代码绕过去了
node.js
光影少年14 小时前
Redis + Node 如何支撑百万级并发
redis·后端·node.js
半个落月14 小时前
从“等待整段答案”到边生成边展示:大模型流式输出与 SSE 实战(上)
langchain·node.js
百万蹄蹄向前冲14 小时前
一句话生成Node.js学习官网秒发布上线
前端·后端·node.js
半个落月14 小时前
让大模型稳定返回可用数据:Output Parser、Zod 与 Tool Calling(下)
langchain·node.js