dgram=Node.js的UDP模块,适合快轻实时的通信场景

node:dgramNode.js 用来做 UDP(User Datagram Protocol)通信的核心模块
它的特点是:无连接、低延迟、不保证可靠性,常用于实时性要求高、能容忍丢包的场景。


一、dgram 是干嘛的(一句话)

用 UDP 发/收数据包(datagram)

对比你熟悉的模块:

模块协议特点
http HTTP(TCP) 有连接、可靠、慢一点
net TCP 有连接、可靠
dgram UDP 无连接、快、可能丢包

二、UDP 的典型使用场景

实时性优先
少量数据 / 高频通信

常见场景:

  • 🎮 游戏实时同步(位置、状态)

  • 📡 局域网发现(设备搜索、心跳)

  • 📺 音视频流(RTSP、RTP)

  • 📊 日志 / 监控打点(丢一两个不重要)

  • 🌐 DNS 查询(就是 UDP)


三、核心 API 速览

const dgram = require('node:dgram');

创建 socket

const socket = dgram.createSocket('udp4'); // 或 udp6

常用事件

事件说明
message 收到 UDP 数据
listening 开始监听
error 错误
close socket 关闭

四、最简单示例(UDP 服务端)

server.js

const dgram = require('node:dgram');

const server = dgram.createSocket('udp4');

server.on('message', (msg, rinfo) => {
  console.log(`收到消息: ${msg.toString()}`);
  console.log(`来自: ${rinfo.address}:${rinfo.port}`);

  // 回复客户端
  server.send(
    'pong',
    rinfo.port,
    rinfo.address
  );
});

server.on('listening', () => {
  const address = server.address();
  console.log(`UDP 服务已启动 ${address.address}:${address.port}`);
});

server.bind(41234);

五、最简单示例(UDP 客户端)

client.js

const dgram = require('node:dgram');

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

client.send(
  'ping',
  41234,
  '127.0.0.1',
  (err) => {
    if (err) console.error(err);
    console.log('消息已发送');
  }
);

client.on('message', (msg) => {
  console.log(`服务端回复: ${msg.toString()}`);
  client.close();
});

运行顺序:

node server.js
node client.js

六、UDP vs TCP(直观理解)

TCP(net / http)

  • 📞 打电话

  • 先建立连接

  • 不丢数据

  • 慢一点

UDP(dgram)

  • 📢 喊话

  • 不管对方在不在

  • 可能听不清

  • 非常快


七、一个更真实的例子:心跳包

服务端(统计在线设备)

server.on('message', (msg, rinfo) => {
  if (msg.toString() === 'heartbeat') {
    console.log(`设备在线: ${rinfo.address}`);
  }
});

客户端(每 5 秒发一次)

setInterval(() => {
  client.send('heartbeat', 41234, '127.0.0.1');
}, 5000);

八、dgram 的注意点(很重要)

❌ 不保证送达
❌ 不保证顺序
❌ 不自动重传

如果你需要:

需求方案
必须可靠 TCP / HTTP
实时但可丢包 UDP / dgram
实时 + 可靠 自己在 UDP 上做协议

九、一句话总结

dgram = Node.js 的 UDP 模块,适合“快、轻、实时”的通信场景

 

posted @ 2025-12-18 14:56  jerry-mengjie  阅读(6)  评论(0)    收藏  举报