Node.js的API之dgram的用法详解

dgram 是 Node.js 提供的一个核心模块,用于实现 UDP(User Datagram Protocol) 通信。UDP 是一种无连接的、轻量级的传输协议,适用于对实时性要求高、允许少量数据丢失的场景(如视频流、在线游戏等)。

1. dgram 的概念

dgram 模块提供了创建 UDP 服务器和客户端的能力。与 TCP 不同,UDP 不建立连接,而是直接发送数据包(datagram)。它的特点包括:

  • 无连接:不需要建立连接,直接发送数据。
  • 不可靠:不保证数据包的顺序和可靠性,可能会丢失或重复。
  • 高效:由于没有连接建立和维护的开销,UDP 比 TCP 更轻量。

2. dgram 的基本用法

2.1 创建 UDP 服务器

以下是一个 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);
代码说明:
  1. dgram.createSocket('udp4')
    • 创建一个 IPv4 的 UDP Socket。
    • 如果要支持 IPv6,可以使用 'udp6'
  2. server.on('message', callback)
    • 当服务器接收到消息时触发。
    • msg 是接收到的数据(Buffer 类型)。
    • rinfo 包含发送方的地址和端口信息。
  3. server.bind(port)
    • 绑定服务器到指定端口,开始监听数据包。

2.2 创建 UDP 客户端

以下是一个 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();
});
代码说明:
  1. client.send()
    • 发送消息到指定的地址和端口。
    • 参数说明:
      • message:要发送的数据(Buffer 类型)。
      • 0:数据的起始位置。
      • message.length:数据的长度。
      • 41234:目标端口。
      • 'localhost':目标地址。
      • 回调函数:发送完成后的回调。
  2. client.on('message', callback)
    • 如果服务器有回复消息,客户端可以在这里接收。

3. dgram 的优缺点

3.1 优点

  1. 高效
    • UDP 没有连接建立和维护的开销,适合低延迟的场景。
  2. 轻量
    • 数据包头部比 TCP 小,传输效率更高。
  3. 支持广播和多播
    • UDP 支持向多个客户端发送广播或多播消息。
  4. 适合实时应用
    • 适用于视频流、在线游戏、DNS 查询等对实时性要求高的场景。

3.2 缺点

  1. 不可靠
    • 不保证数据包的顺序和可靠性,可能会丢失、重复或乱序。
  2. 无连接
    • 无法像 TCP 那样建立稳定的连接,不适合需要可靠传输的场景。
  3. 数据包大小限制
    • UDP 数据包的最大大小为 64KB(包括头部),超过需要分片。

4. dgram 的高级用法

4.1 广播消息

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':广播地址,表示发送到同一网络中的所有设备。

4.2 多播消息

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.0239.255.255.255
  • 客户端需要加入多播组才能接收消息。

5. 总结

  • dgram 模块 提供了 UDP 通信的能力,适合低延迟、高效率的场景。
  • 优点:高效、轻量、支持广播和多播。
  • 缺点:不可靠、无连接、数据包大小受限。
  • 适用场景:视频流、在线游戏、DNS 查询、实时通信等。

通过 dgram,你可以轻松实现基于 UDP 的网络通信,但需要注意其不可靠性,必要时可以在应用层实现可靠性机制(如重传、校验等)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/966966.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【config目录】SpringBoot应用配置存放的地方

application.properties之前总是存放于默认的resources目录下,现在想想其实是不合适的,上线后其实这个配置是需要更改的,因此我们不要打包到jar包中。 根据SpringBoot应用配置查找规则,如果在jar包中resources目录查找不到的话&a…

洛谷 B3616 【模板】队列

B3616 【模板】队列 - 洛谷 | 计算机科学教育新生态 题目描述 请你实现一个队列(queue),支持如下操作: push(x):向队列中加入一个数 x。pop():将队首弹出。如果此时队列为空,则不进行弹出操作…

布丁扫描:手机扫描的纯净之选

在众多手机扫描软件中,布丁扫描凭借其纯粹的使用体验脱颖而出。它是一款功能强大且完全免费的手机端扫描工具,没有任何广告干扰,用户可以畅享纯净的使用过程。更值得一提的是,布丁扫描从未设置过充值入口,也不会在扫描…

2025 CCF BDCI|“基于TPU平台的OCR模型性能优化”一等奖作品

2024年12月,中国计算机学会在海南博鳌成功举办了第十二届CCF大数据与计算智能大赛(简称2024 CCF BDCI)。本届比赛的算能赛道吸引了1748名选手报名,经过激烈角逐,北京航空航天大学的“常务副SOTA”团队脱颖而出&#xf…

22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口

1 CSS常见单位详解 CSS中的单位 CSS中的绝对单位( Absolute length units ) CSS中的相对单位( Relative length units ) 1.em: 相对自己的font-size;如果自己没有设置, 那么会继承父元素的font-size 2.如果font-size中…

网站改HTTPS方法

默认的网站建设好后打开的样子那看起来像是钓鱼网站,现在的浏览器特别只能,就是你新买来的电脑默认的浏览器同样也会出现这样“不安全”提示。 传输协议启动了向全球用户安全传输网页内容的流程。然而,随着HTTPS的推出,传输协议通…

MySQL的底层原理与架构

前言 了解MySQL的架构和原理对于很多的后续很多的操作会有很大的帮助与理解。并且很多知识都与底层架构相关联。 了解MySQL架构 通过上面的架构图可以得知,Server层中主要由 连接器、查询缓存、解析器/分析器、优化器、执行器 几部分组成的,下面将主要…

极客说|利用 Azure AI Agent Service 创建自定义 VS Code Chat participant

作者:卢建晖 - 微软高级云技术布道师 「极客说」 是一档专注 AI 时代开发者分享的专栏,我们邀请来自微软以及技术社区专家,带来最前沿的技术干货与实践经验。在这里,您将看到深度教程、最佳实践和创新解决方案。关注「极客说」&a…

艾蒿染色体水平基因组-文献精读111

A chromosome-scale genome assembly of Artemisia argyi reveals unbiased subgenome evolution and key contributions of gene duplication to volatile terpenoid diversity 一项关于艾蒿(Artemisia argyi)的染色体尺度基因组组装揭示了无偏的亚基因…

【Linux系统】线程:线程的优点 / 缺点 / 超线程技术 / 异常 / 用途

1、线程的优点 创建和删除线程代价较小 创建一个新线程的代价要比创建一个新进程小得多,删除代价也小。这种说法主要基于以下几个方面: (1)资源共享 内存空间:每个进程都有自己独立的内存空间,包括代码段…

光学和光子学模拟工具在 AR/VR 中的作用

AR/VR 中的光学和光子学 增强现实 (AR) 和虚拟现实 (VR) 站在数字进化的前沿。光学和光子学这一复杂的科学深入研究了光的产生、检测和操控,在这一转变中发挥着至关重要的作用。 图 1 (a) 展示了 AR 系统的设计,强调了光学的关键作用。该图描绘了光的旅…

U3D支持webgpu阅读

https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…

BFS算法篇——FloodFill问题的高效解决之道(下)

文章目录 前言一. 图像渲染1.1 题目链接:https://leetcode.cn/problems/flood-fill/description/1.2 题目分析:1.3 思路讲解:1.4 代码实现: 二. 岛屿数量2.1 题目链接:https://leetcode.cn/problems/number-of-islands…

DEEPSEEK与GPT等AI技术在机床数据采集与数字化转型中的应用与影响

随着人工智能(AI)技术的迅猛发展,深度学习、自然语言处理等先进技术开始广泛应用于各行各业。在制造业尤其是机床行业,AI技术的融合带来了巨大的变革,尤其在机床数据采集与机床数字化方面的应用。本文将探讨DEEPSEEK、…

android手机安装deepseek-r1:1.5b

序 本文主要展示一下如何在android手机上安装deepseek-r1:1.5b 步骤 安装termux 到https://termux.dev/cn/index.html去下载 然后执行termux-setup-storage以获取手机存储权限 安装构建依赖 pkg install git cmake golang下载ollama git clone --depth 1 https://gitee.…

单张照片可生成写实3D头部模型!Adobe提出FaceLift,从单一的人脸图像中重建出360度的头部模型。

FaceLift是Adobe和加州大学默塞德分校推出的单图像到3D头部模型的转换技术,能从单一的人脸图像中重建出360度的头部模型。FaceLift基于两阶段的流程实现:基于扩散的多视图生成模型从单张人脸图像生成一致的侧面和背面视图;生成的视图被输入到GS-LRM重建器中,产出详细的3D高斯表…

如何使用 DataX 连接 Easysearch

DataX DataX 是阿里开源的一款离线数据同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等各种异构数据源之间稳定高效的数据同步功能。 本篇主要介绍 DataX 如何将数据写入到 Easysearch,对于各种数据源的连接…

Gemini 2.0模型更新:谷歌最新AI大模型全面开启智能时代

引言 2025年2月5日,谷歌人工智能实验室(Google DeepMind)发布了最新的Gemini 2.0模型系列更新,包括2.0 Flash、Flash-Lite和Pro实验版本。这些AI大模型的发布标志着人工智能技术在性能、效率和多模态能力上的进一步突破&#xff…

Visual Studio 2022 中使用 Google Test

要在 Visual Studio 2022 中使用 Google Test (gtest),可以按照以下步骤进行: 安装 Google Test:确保你已经安装了 Google Test。如果没有安装,可以通过 Visual Studio Installer 安装。在安装程序中,找到并选择 Googl…

基于SpringBoot的校园社交平台

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…