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利用mongoose获取mongodb数据的格式化问题详解

    node.js利用mongoose获取mongodb数据的格式化问题详解

    这篇文章主要给大家介绍了关于node.js利用mongoose获取mongodb数据的格式化问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习把。
    2017-10-10
  • node.js的Express服务器基本使用教程

    node.js的Express服务器基本使用教程

    express是一个开源的node.js项目框架,下面这篇文章主要给大家介绍了关于node.js的Express服务器基本使用的相关资料,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2019-01-01
  • node puppeteer爬虫爬取电影网站及生成pdf文档示例

    node puppeteer爬虫爬取电影网站及生成pdf文档示例

    这篇文章主要介绍了node puppeteer爬虫爬取电影网站及生成pdf文档使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-07-07
  • nodejs 整合kindEditor实现图片上传

    nodejs 整合kindEditor实现图片上传

    这篇文章主要介绍了nodejs 整合kindEditor实现图片上传,需要的朋友可以参考下
    2015-02-02
  • Nodejs + sequelize 实现增删改查操作

    Nodejs + sequelize 实现增删改查操作

    这篇文章主要介绍了Nodejs + sequelize 实现增删改查操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Nodejs中koa2连接mysql的实现示例

    Nodejs中koa2连接mysql的实现示例

    本文主要介绍了Nodejs中koa2连接mysql的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • NodeJS学习笔记之MongoDB模块

    NodeJS学习笔记之MongoDB模块

    nodejs是个强大的平台,有基本功能,而且可以挂很多模块。我们现在需要和mongodb连接的驱动,就类似比如mysql的java驱动一样。nodejs有好几个mongodb的第三方驱动。和jdbc不一样,没有标准。所以需要到驱动的网站上去了解学习怎么使用它访问mongodb。
    2015-01-01
  • 利用Node转换Excel成JSON的详细步骤

    利用Node转换Excel成JSON的详细步骤

    最近工作中遇到一个需求,大致需求就是将Excel文件在导入时解析为json格式转换数据结构再传输给后台,下面这篇文章主要给大家介绍了关于如何利用Node转换Excel成JSON的详细步骤,需要的朋友可以参考下
    2022-11-11
  • Node.js使用MySQL连接池的方法实例

    Node.js使用MySQL连接池的方法实例

    这篇文章主要介绍了Node.js使用MySQL连接池的方法,结合具体实例形式分析了nodejs操作mysql连接池的相关模块安装、连接、查询等使用技巧,需要的朋友可以参考下
    2018-02-02
  • node.js中的console.error方法使用说明

    node.js中的console.error方法使用说明

    这篇文章主要介绍了node.js中的console.error方法使用说明,本文介绍了console.error的方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12

最新评论