📜  Node.js UDPDataGram 完整参考(1)

📅  最后修改于: 2023-12-03 14:44:40.635000             🧑  作者: Mango

Node.js UDPDataGram 完整参考

简介

UDP 协议是一种简单的,无连接的,基于数据报的网络传输协议,常用于实时通信、流媒体等场景。Node.js 中提供了 dgram 模块,可以用来创建 UDP 服务器和客户端。

本文将介绍 UDP 数据包传输的基础概念、 Node.js 中的 dgram 模块以及如何使用 Node.js 创建 UDP 服务器和客户端。

UDP 数据包

UDP 数据包主要由以下部分组成:

  • 源端口号
  • 目标端口号
  • 长度
  • 校验和
  • 数据部分

UDP 优点在于传输速度快,但传输过程中可能会有丢包、乱序等情况发生。

Node.js dgram 模块

Node.js 中的 dgram 模块提供了创建 UDP 服务器和客户端的方法,同时也支持 multicast(多播)传输、广播等功能。使用 dgram 模块需要先通过 require 引入:

const dgram = require('dgram');
创建 UDP 服务器

使用 dgram.createSocket 方法可以创建一个 UDP 服务器,代码如下:

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

server.on('listening', function() {
  const address = server.address();
  console.log(`UDP server listening on ${address.address}:${address.port}`);
});

server.on('message', function(message, remote) {
  console.log(`UDP server received message: ${message} from ${remote.address}:${remote.port}`);

  // Echo back the message to the client
  server.send(message, remote.port, remote.address, function(error) {
    if (error) {
      console.error(`Error sending response to ${remote.address}:${remote.port}: ${error.message}`);
    }
  });
});

server.bind(1234);

上述代码创建了一个 UDP 服务器,监听本地的 1234 端口。当有 UDP 数据包到达时,服务器会触发 message 事件,并输出接收到的消息内容和发送源的地址信息。同时,服务器也会将接收到的消息内容打包成数据包回传给消息来源。

创建 UDP 客户端

使用 dgram.createSocket 方法可以创建一个 UDP 客户端。代码如下:

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

const message = Buffer.from('Hello from client!');

client.send(message, 1234, 'localhost', function(error) {
  if (error) {
    console.error(`Error sending message to server: ${error.message}`);
  } else {
    console.log('Message sent to server!');
  }
});

client.on('message', function(message, remote) {
  console.log(`UDP client received message: ${message} from ${remote.address}:${remote.port}`);
});

client.on('error', function(error) {
  console.error(`Error: ${error.message}`);
});

client.on('close', function() {
  console.log('UDP client closed!');
});

上述代码创建了一个 UDP 客户端,并向本地的 1234 端口发送一条消息。当服务器将接收到的消息内容回传给客户端时,客户端会触发 message 事件,并输出接收到的消息内容和发送源的地址信息。同时,客户端也可以监听 error 事件和 close 事件。

多播和广播

除了常规的单播消息传输,Node.js dgram 模块还支持多播和广播传输。比如,你可以将一条 UDP 消息发送给同一网络中的多个设备。

多播

多播需要加入一个多播组,然后就可以向这个组内所有成员广播消息了。代码如下:

const multicastAddress = '239.255.255.255';
const port = 1234;

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

client.bind(function() {
  client.setBroadcast(true);
  client.setMulticastTTL(128);
  client.addMembership(multicastAddress);
});

const message = Buffer.from('Hello from multicast!');

client.send(message, port, multicastAddress, function(error) {
  if (error) {
    console.error(`Error sending multicast message: ${error.message}`);
  } else {
    console.log('Multicast message sent!');
  }
});

client.on('message', function(message, remote) {
  console.log(`UDP client received multicast message: ${message} from ${remote.address}:${remote.port}`);
});

client.on('error', function(error) {
  console.error(`Error: ${error.message}`);
});

client.on('close', function() {
  console.log('UDP client closed!');
});

上述代码创建了一个 UDP 客户端,加入了一个多播组,并发送一条消息到指定端口号。当其他加入同一多播组的设备收到该消息时,会触发 message 事件,并输出接收到的消息内容和发送源的地址信息。

广播

广播是将消息发送到本地网络的所有设备,代码如下:

const broadcastAddress = '192.168.1.255';
const port = 1234;

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

client.bind(function() {
  client.setBroadcast(true);
});

const message = Buffer.from('Hello from broadcast!');

client.send(message, port, broadcastAddress, function(error) {
  if (error) {
    console.error(`Error sending broadcast message: ${error.message}`);
  } else {
    console.log('Broadcast message sent!');
  }
});

client.on('message', function(message, remote) {
  console.log(`UDP client received broadcast message: ${message} from ${remote.address}:${remote.port}`);
});

client.on('error', function(error) {
  console.error(`Error: ${error.message}`);
});

client.on('close', function() {
  console.log('UDP client closed!');
});

上述代码创建了一个 UDP 客户端,并向本地网络的所有设备广播一条消息。当其他设备收到该消息时,会触发 message 事件,并输出接收到的消息内容和发送源的地址信息。

总结

本文介绍了 UDP 数据包传输的基础概念,以及如何使用 Node.js dgram 模块创建 UDP 服务器和客户端。同时,还介绍了如何使用 dgram 模块支持的多播和广播功能。对于需要实时通信、流媒体等场景,UDP 协议仍然是一个不错的选择。