引言

之前我们介绍了使用 Nodejs 的 net 模块基于 Socket 创建 TCP 协议的服务,同时利用浏览器与我们创建的服务进行了连接,今天我们看一下怎么用 Nodejs 创建 UDP 服务。

UDP又称用户数据包协议,与TCP一样同属于网络传输层。UDP与TCP最大的不同是UDP是无连接的。TCP中连接一旦建立,所有的会话都基于连接完成,客户端如果要与另一个TCP服务通信,需要另创建一个套接字socket来完成连接。

在UDP中,它提供面向事务的简单不可靠信息传输服务,在网络差的情况下存在丢包严重的问题。但是由于它无须连接,资源消耗低,处理快速且灵活,所以常常应用在那种偶尔丢一两个数据包也不会产生重大影响的场景:比如音视频、流媒体服务等。目前DNS服务、HTTP/3都是基于它实现的。

创建一个 UDP 通信

创建 UDP 套接字

你可以通过 dgram 模块提供的方法来创建UDP套接字:

const datagram = require("dgram");
const socket = datagram.createSocket("udp4");

💡 UDP套接字一旦创建,既可以作为客户端发送数据,也可以作为服务器端接收数据。

绑定端口

若想让UDP套接字接收网络消息,只要调用 dgram.bind(port, [address]) 方法对网卡和端口进行绑定即可:

const datagram = require("dgram");
const socket = datagram.createSocket("udp4");
socket.on('message', (msg, rinfo) => {
    console.log(`server got message: ${msg} from ${rinfo.address}:${rinfo.port}`);
    // 3s后关闭此连接
    setTimeout(() => {
        socket.close();
    }, 3000)
});
socket.on('listening', () => {
    const address = socket.address();
    console.log("server listening:", address.address   ":"   address.port);
});
socket.on('close', () => {
    console.log('closed server!');
})
socket.bind(41234);

💡 该套接字将接收所有网卡上41234端口上的消息。在绑定完成后,将触发listening事件。

创建服务端

现在让我们创建一个服务端来与刚才的服务进行通信:

const dgram = require("dgram");
const client = dgram.createSocket("udp4");
// 创建 Buffer 流
const message = new Buffer.from("你好,upd服务端!");
client.send(message, 0, message.length, 41234, '127.0.0.1', (err, bytes) => {
    client.close();
});

💡 socket.send(buf, offset, length, port, address, [callback]) 可以将客户端信息发送到目标地址。这些参数分别为要发送的Buffer、Buffer的偏移、Buffer的长度、目标端口、目标地址、发送完成后的回调。

与TCP套接字的write()相比,send()方法的参数列表相对复杂,但是它更灵活的地方在于可以随意发送数据到网络中的服务器端,而TCP如果要发送数据给另一个服务器端,则需要重新通过套接字构造新的连接。

最终运行效果:

UDP 套接字事件

UDP套接字相对TCP套接字使用起来更简单,它只是一个 EventEmitter 的实例,而非 Stream 的实例。它具备如下自定义事件:

  • message:当UDP套接字侦听网卡端口后,接收到消息时触发该事件,触发携带的数据为消息Buffer对象和一个远程地址信息。
  • listening:当UDP套接字开始侦听时触发该事件。
  • close:调用close()方法时触发该事件,并不再触发message事件。
  • error:当异常发生时触发该事件,如果不侦听,异常将直接抛出,使进程退出。

总结

TCP与UDP都属于互联网中传输层的协议,如果要构造高效的网络应用,就应该从传输层进行着手。但是对于经典的应用场景,则无须从传输层协议入手构造自己的应用。比如HTTP、FTP等,这些经典的应用层协议对于普通应用而言绰绰有余。Node提供了基本的 httphttps 模块用于HTTP和HTTPS的封装,而对于其他应用层协议的封装,你可以在社区中找到其实现。

以上就是Nodejs使用dgram模块创建UDP服务详解的详细内容,更多关于Nodejs dgram模块创建UDP的资料请关注Devmax其它相关文章!

Nodejs使用dgram模块创建UDP服务详解的更多相关文章

  1. 当iOS应用程序进入后台时,TCP和UDP(与多播)连接会发生什么

    我创建了几个实验:设置1:我创建了一个TCPSender应用程序和一个TCPReceiver应用程序.在本次实验中,我在iOS设备上启动了TCPSender,在另一台iOS设备上启动了TCPReceiver.然后两者都经过验证已建立连接并发送和接收数据.然后我将TCPReceiver应用程序置于后台.TCPSender应用程序指示连接丢失和崩溃(是的,我打算这样).设置2:我创建了一个UDPSen

  2. 我应该使用哪个高级API来管理iOS上的UDP套接字?

    在“NetworkProgrammingTopicsConceptualGuide”的“UsingSocketsandStreams”一章中,Apple说:Note:POSIXnetworkingdoesnotactivatethecellularradiooniOS.Forthisreason,thePOSIXnetworkingAPIisgenerallydiscouragediniOS.同样

  3. ios – Swift:使用GCDAsyncUdpSocket接收UDP

    开始:接收:发送:编辑:添加了忘记的代码行.解决方法我终于得到它使用这个套接字设置:

  4. Swift开发:GCDAsyncUdpSocket 通信之UDP广播

    ;//2主界面ui显示数据dispatch_async}funcudpSocket(sock:GCDAsyncUdpSocket!

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  7. 浅析Nodejs npm常用命令

    这篇文章主要介绍了浅析Nodejs npm常用命令的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

  8. nodejs 使用nodejs-websocket模块实现点对点实时通讯

    这篇文章主要介绍了nodejs 使用nodejs-websocket模块实现点对点实时通讯的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

  9. nodeJs链接Mysql做增删改查的简单操作

    本篇文章主要介绍了nodeJs链接Mysql做增删改查的简单操作,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Nodejs中使用captchapng模块生成图片验证码

    本篇文章主要介绍了Nodejs中使用captchapng模块实现图片验证码,非常具有实用价值,需要的朋友可以参考下

随机推荐

  1. Error: Cannot find module ‘node:util‘问题解决

    控制台 安装 Vue-Cli 最后一步出现 Error: Cannot find module 'node:util' 问题解决方案1.问题C:\Windows\System32>cnpm install -g @vue/cli@4.0.3internal/modules/cjs/loader.js:638 throw err; &nbs

  2. yarn的安装和使用(全网最详细)

    一、yarn的简介:Yarn是facebook发布的一款取代npm的包管理工具。二、yarn的特点:速度超快。Yarn 缓存了每个下载过的包,所以再次使用时无需重复下载。 同时利用并行下载以最大化资源利用率,因此安装速度更快。超级安全。在执行代码之前,Yarn 会通过算法校验每个安装包的完整性。超级可靠。使用详细、简洁的锁文件格式和明确的安装算法,Yarn 能够保证在不同系统上无差异的工作。三、y

  3. 前端环境 本机可切换node多版本 问题源头是node使用的高版本

    前言投降投降 重头再来 重装环境 也就分分钟的事 偏要折腾 这下好了1天了 还没折腾出来问题的源头是node 使用的高版本 方案那就用 本机可切换多版本最终问题是因为nodejs的版本太高,导致的node-sass不兼容问题,我的node是v16.14.0的版本,项目中用了"node-sass": "^4.7.2"版本,无法匹配当前的node版本根据文章的提

  4. nodejs模块学习之connect解析

    这篇文章主要介绍了nodejs模块学习之connect解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. nodejs npm package.json中文文档

    这篇文章主要介绍了nodejs npm package.json中文文档,本文档中描述的很多行为都受npm-config(7)的影响,需要的朋友可以参考下

  6. 详解koa2学习中使用 async 、await、promise解决异步的问题

    这篇文章主要介绍了详解koa2学习中使用 async 、await、promise解决异步的问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  7. Node.js编写爬虫的基本思路及抓取百度图片的实例分享

    这篇文章主要介绍了Node.js编写爬虫的基本思路及抓取百度图片的实例分享,其中作者提到了需要特别注意GBK转码的转码问题,需要的朋友可以参考下

  8. CentOS 8.2服务器上安装最新版Node.js的方法

    这篇文章主要介绍了CentOS 8.2服务器上安装最新版Node.js的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  9. node.js三个步骤实现一个服务器及Express包使用

    这篇文章主要介绍了node.js三个步骤实现一个服务器及Express包使用,文章通过新建一个文件展开全文内容,具有一定的参考价值,需要的小伙伴可以参考一下

  10. node下使用UglifyJS压缩合并JS文件的方法

    下面小编就为大家分享一篇node下使用UglifyJS压缩合并JS文件的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

返回
顶部