dgram
是 Node.js 提供的一个核心模块,用于实现 UDP(User Datagram Protocol) 通信。UDP 是一种无连接的、轻量级的传输协议,适用于对实时性要求高、允许少量数据丢失的场景(如视频流、在线游戏等)。
dgram
的概念dgram
模块提供了创建 UDP 服务器和客户端的能力。与 TCP 不同,UDP 不建立连接,而是直接发送数据包(datagram)。它的特点包括:
dgram
的基本用法以下是一个 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);
dgram.createSocket('udp4')
:
'udp6'
。server.on('message', callback)
:
msg
是接收到的数据(Buffer 类型)。rinfo
包含发送方的地址和端口信息。server.bind(port)
:
以下是一个 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();
});
client.send()
:
message
:要发送的数据(Buffer 类型)。0
:数据的起始位置。message.length
:数据的长度。41234
:目标端口。'localhost'
:目标地址。client.on('message', callback)
:
dgram
的优缺点dgram
的高级用法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'
:广播地址,表示发送到同一网络中的所有设备。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.0
到 239.255.255.255
。dgram
模块 提供了 UDP 通信的能力,适合低延迟、高效率的场景。通过 dgram
,你可以轻松实现基于 UDP 的网络通信,但需要注意其不可靠性,必要时可以在应用层实现可靠性机制(如重传、校验等)。