dgram=Node.js的UDP模块,适合快轻实时的通信场景
node:dgram 是 Node.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 模块,适合“快、轻、实时”的通信场景

浙公网安备 33010602011771号