当前位置: 首页 > article >正文

Node.js的API之dgram的用法详解

dgram 是 Node.js 提供的一个核心模块,用于实现 UDP(User Datagram Protocol) 通信。UDP 是一种无连接的、轻量级的传输协议,适用于对实时性要求高、允许少量数据丢失的场景(如视频流、在线游戏等)。

1. dgram 的概念

dgram 模块提供了创建 UDP 服务器和客户端的能力。与 TCP 不同,UDP 不建立连接,而是直接发送数据包(datagram)。它的特点包括:

  • 无连接:不需要建立连接,直接发送数据。
  • 不可靠:不保证数据包的顺序和可靠性,可能会丢失或重复。
  • 高效:由于没有连接建立和维护的开销,UDP 比 TCP 更轻量。

2. dgram 的基本用法

2.1 创建 UDP 服务器

以下是一个 UDP 服务器的示例:

const dgram = require('dgram');

// 创建 UDP 服务器
const server = dgram.createSocket('udp4');

// 监听消息事件
server.on('message', (msg, rinfo) => {
  console.log(`Server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
});

// 监听服务器启动事件
server.on('listening', () => {
  const address = server.address();
  console.log(`Server listening on ${address.address}:${address.port}`);
});

// 绑定端口
server.bind(41234);
代码说明:
  1. dgram.createSocket('udp4')
    • 创建一个 IPv4 的 UDP Socket。
    • 如果要支持 IPv6,可以使用 'udp6'
  2. server.on('message', callback)
    • 当服务器接收到消息时触发。
    • msg 是接收到的数据(Buffer 类型)。
    • rinfo 包含发送方的地址和端口信息。
  3. server.bind(port)
    • 绑定服务器到指定端口,开始监听数据包。

2.2 创建 UDP 客户端

以下是一个 UDP 客户端的示例:

const dgram = require('dgram');

// 创建 UDP 客户端
const client = dgram.createSocket('udp4');

// 要发送的消息
const message = Buffer.from('Hello, UDP Server!');

// 发送消息到服务器
client.send(message, 0, message.length, 41234, 'localhost', (err) => {
  if (err) {
    console.error('Failed to send message:', err);
    client.close();
  } else {
    console.log('Message sent to server');
  }
});

// 监听消息事件(可选)
client.on('message', (msg, rinfo) => {
  console.log(`Client got: ${msg} from ${rinfo.address}:${rinfo.port}`);
  client.close();
});
代码说明:
  1. client.send()
    • 发送消息到指定的地址和端口。
    • 参数说明:
      • message:要发送的数据(Buffer 类型)。
      • 0:数据的起始位置。
      • message.length:数据的长度。
      • 41234:目标端口。
      • 'localhost':目标地址。
      • 回调函数:发送完成后的回调。
  2. client.on('message', callback)
    • 如果服务器有回复消息,客户端可以在这里接收。

3. dgram 的优缺点

3.1 优点

  1. 高效
    • UDP 没有连接建立和维护的开销,适合低延迟的场景。
  2. 轻量
    • 数据包头部比 TCP 小,传输效率更高。
  3. 支持广播和多播
    • UDP 支持向多个客户端发送广播或多播消息。
  4. 适合实时应用
    • 适用于视频流、在线游戏、DNS 查询等对实时性要求高的场景。

3.2 缺点

  1. 不可靠
    • 不保证数据包的顺序和可靠性,可能会丢失、重复或乱序。
  2. 无连接
    • 无法像 TCP 那样建立稳定的连接,不适合需要可靠传输的场景。
  3. 数据包大小限制
    • UDP 数据包的最大大小为 64KB(包括头部),超过需要分片。

4. dgram 的高级用法

4.1 广播消息

UDP 支持广播消息,可以向同一网络中的所有设备发送消息:

const dgram = require('dgram');
const client = dgram.createSocket('udp4');

// 允许广播
client.bind(() => {
  client.setBroadcast(true);
});

const message = Buffer.from('Hello, everyone!');
client.send(message, 0, message.length, 41234, '255.255.255.255', (err) => {
  if (err) {
    console.error('Failed to send broadcast:', err);
  } else {
    console.log('Broadcast message sent');
  }
  client.close();
});
说明:
  • client.setBroadcast(true):启用广播功能。
  • '255.255.255.255':广播地址,表示发送到同一网络中的所有设备。

4.2 多播消息

UDP 支持多播消息,可以向一组特定的设备发送消息:

const dgram = require('dgram');
const client = dgram.createSocket('udp4');

const multicastAddress = '230.185.192.108'; // 多播地址
const message = Buffer.from('Hello, multicast group!');

client.send(message, 0, message.length, 41234, multicastAddress, (err) => {
  if (err) {
    console.error('Failed to send multicast:', err);
  } else {
    console.log('Multicast message sent');
  }
  client.close();
});
说明:
  • 多播地址范围:224.0.0.0239.255.255.255
  • 客户端需要加入多播组才能接收消息。

5. 总结

  • dgram 模块 提供了 UDP 通信的能力,适合低延迟、高效率的场景。
  • 优点:高效、轻量、支持广播和多播。
  • 缺点:不可靠、无连接、数据包大小受限。
  • 适用场景:视频流、在线游戏、DNS 查询、实时通信等。

通过 dgram,你可以轻松实现基于 UDP 的网络通信,但需要注意其不可靠性,必要时可以在应用层实现可靠性机制(如重传、校验等)。


http://www.kler.cn/a/539551.html

相关文章:

  • Django操作指令大集合说明
  • html文件怎么转换成pdf文件,2025最新教程
  • C++字符串相关内容
  • 使用 POI-TL 和 JFreeChart 动态生成 Word 报告
  • 《ARM64体系结构编程与实践》学习笔记(四)
  • python爬虫--简单登录
  • 位图与位运算的深度联系:从图像处理到高效数据结构的C++实现与优化
  • stm32电机驱动模块
  • npm link,lerna,pnmp workspace区别
  • 机器学习-线性回归(最大似然估计)
  • 最新的构建Jenkins插件的方式
  • 基于无线的分布式温度采集报警系统设计(论文+源码)
  • Git 日志查看与版本回溯
  • 软件工程的熵减:AI如何降低系统复杂度
  • 在 Java 中执行一个复杂的 SQL 查询(包含多表连接、子查询和聚合函数),如何确保查询的性能?请列举至少三条措施。请简要描述其工作原理?
  • 【课程设计参考】迷宫小游戏 :基于 Python+Pygame+AI算法
  • 大语言模型实践——基于现有API的二次开发
  • fetch请求总结,fastadmin中后台接口强制返回json数据
  • DeepSeek本地化部署【window下安装】【linux下安装】
  • 【React】页面刷新后状态丢失的原因与解决方案
  • 如何高效管理多个Facebook账户:矩阵操作的最佳实践
  • QUIC 协议与 TCP 协议相比,有哪些具体的优势和劣势?
  • 要使 if(USART_GetITStatus(USART3, USART_IT_TC) != RESET) 条件满足
  • 解决com.kingbase8.util.KSQLException: This _connection has been closed.
  • 解锁VSCode新姿势:与Deep Seek携手高效编程
  • 事务-----mysql