Skip to content

Node.js dgram 模块(UDP)

dgram 用于创建 UDP 通信,与 TCP 不同:无连接、不可靠、低延迟,适合实时性优先的场景。

UDP vs TCP

TCPUDP
连接面向连接,三次握手无连接
可靠性确认重传,保证送达不保证送达、不保证顺序
速度较慢快(无握手、无确认)
场景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 查询单次请求响应
日志收集高吞吐不丢关键(可接受偶尔丢失)
物联网设备轻量级传感器数据上报