Nodejs使用dgram模块创建UDP服务详解

 更新时间:2022年10月18日 15:54:41   作者:SaraiNoQ  
这篇文章主要为大家介绍了Nodejs使用dgram模块创建UDP服务详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

之前我们介绍了使用 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的资料请关注脚本之家其它相关文章!

相关文章

  • Node.js 子线程Crash 问题的排查方法

    Node.js 子线程Crash 问题的排查方法

    这篇文章主要介绍了Node.js 子线程Crash 问题的排查,本文通过代码例子给大家详细讲解,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 使用socket.io实现简单聊天室案例

    使用socket.io实现简单聊天室案例

    这篇文章主要介绍了使用socket.io实现简单聊天室案例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Node.js通过配置 strict-ssl=false解决npm安装卡住问题

    Node.js通过配置 strict-ssl=false解决npm安装卡住问题

    使用npm安装依赖包是常见的任务之一,有时会遇到安装卡住的问题,本文就来介绍一下通过配置 strict-ssl=false解决npm安装卡住问题,感兴趣的可以了解一下
    2024-12-12
  • json对象及数组键值的深度大小写转换问题详解

    json对象及数组键值的深度大小写转换问题详解

    这篇文章主要给大家介绍了关于json对象及数组键值的深度大小写转换问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-03-03
  • Nodejs全局安装和本地安装的不同之处

    Nodejs全局安装和本地安装的不同之处

    这篇文章主要介绍了Nodejs全局安装和本地安装的不同之处的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • node.js学习之事件模块Events的使用示例

    node.js学习之事件模块Events的使用示例

    Nodejs中不存在浏览器中冒泡,捕获这些行为,Nodejs中实现了events这个模块,Nodejs中大多数模块都集成了这个模块,所以events是Nodejs中最重要的一个模块。这篇文章主要给大家介绍了关于node.js学习教程之事件模块Events的相关资料,需要的朋友可以参考下。
    2017-09-09
  • 使用Node.js find-up在父目录中高效寻找文件与目录

    使用Node.js find-up在父目录中高效寻找文件与目录

    find-up 是一个小巧但功能强大的 Node.js 包,它能帮助我们实现这一需求,本文将深入探究如何使用 find-up 进行有效搜索,并结合丰富的代码演示帮助大家快速掌握其用法,需要的朋友可以参考下
    2024-05-05
  • Node.js应用设置安全的沙箱环境

    Node.js应用设置安全的沙箱环境

    这篇文章主要介绍了Node.js应用设置安全的沙箱环境的方法以及注意事项,对此有需要的朋友可以参考学习下。
    2018-04-04
  • node.js-fs文件系统模块这是你知道吗

    node.js-fs文件系统模块这是你知道吗

    这篇文章主要为大家详细介绍了node.js-fs文件系统模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-02-02
  • Node.js 搭建后端服务器内置模块( http+url+querystring 的使用)

    Node.js 搭建后端服务器内置模块( http+url+querystring 的使用)

    这篇文章主要介绍了Node.js搭建后端服务器内置模块(http+url+querystring的使用),文章围绕主题展开详细的内容戒杀,具有一定的参考价值,需要的朋友可以参考一下
    2022-09-09

最新评论