文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-11-13 18:31

关注

引言

之前我们介绍了使用 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 的实例。它具备如下自定义事件:

总结

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯