Node.js dgram 模块(UDP)
dgram 用于创建 UDP 通信,与 TCP 不同:无连接、不可靠、低延迟,适合实时性优先的场景。
UDP vs TCP
| TCP | UDP | |
|---|---|---|
| 连接 | 面向连接,三次握手 | 无连接 |
| 可靠性 | 确认重传,保证送达 | 不保证送达、不保证顺序 |
| 速度 | 较慢 | 快(无握手、无确认) |
| 场景 | Web/数据库/文件传输 | 直播/游戏/语音/DNS |
UDP 服务器
js
import dgram from 'node:dgram'
const server = dgram.createSocket('udp4') // 'udp4' 或 'udp6'
server.on('message', (msg, rinfo) => {
console.log(`收到: ${msg} 来自 ${rinfo.address}:${rinfo.port}`)
server.send('ack', rinfo.port, rinfo.address) // 回复
})
server.on('listening', () => {
const address = server.address()
console.log(`UDP 监听 ${address.address}:${address.port}`)
})
server.bind(41234)UDP 客户端
js
import dgram from 'node:dgram'
const client = dgram.createSocket('udp4')
client.send('hello', 41234, 'localhost', (err) => {
if (err) client.close()
})
client.on('message', (msg) => {
console.log(`收到回复: ${msg}`)
client.close()
})广播
js
const server = dgram.createSocket('udp4')
server.bind(() => server.setBroadcast(true))
server.send('广播消息', 41234, '255.255.255.255') // 全局广播多播
js
const MULTICAST_ADDR = '224.0.0.1'
// 接收端
const receiver = dgram.createSocket('udp4')
receiver.bind(41234, () => {
receiver.addMembership(MULTICAST_ADDR) // 加入多播组
})
receiver.on('message', (msg) => console.log(msg.toString()))
// 发送端
const sender = dgram.createSocket('udp4')
sender.send('多播消息', 41234, MULTICAST_ADDR)适用场景
| 场景 | 说明 |
|---|---|
| 实时音视频 | 丢几帧无所谓,延迟最重要 |
| 在线游戏 | 实时状态同步 |
| DNS 查询 | 单次请求响应 |
| 日志收集 | 高吞吐不丢关键(可接受偶尔丢失) |
| 物联网设备 | 轻量级传感器数据上报 |