udp相关
UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议
关于这个node.js
中使用的udp
,则是直接使用的dgram
模块来实现的,而该模块也比较简单,就一个API + 一个对象,API用于创建这个Socket
对象,
通过观察这个模块所导出的api方法,可以发现dgram.createSocket
其实就是new Socket()
的过程!!
那么,什么是dgram的Socket对象?可以用它来作甚?
dgram.createSocket===new Socket()
首先先看一下关于如何使用这个udp模块的, 如 所示: 这里简单创建了一个"server"以及一个"client",这里要对server端以及client端打上引号,是因为这里的socket并非真正意义上的服务端与客户端,因为在
dgram
模块中,并无真正意义上的客户端与服务端, 它只是临时的将一个socket当作普通的server对象而已!
这里每一个socket都可以作为接收端,也可以作为发送端,并没有太多的限制条件,如下代码所示:
const dgram = require('node:dgram');
const server = dgram.createSocket('udp4');
server.on('message', (msg, rinfo) => {
console.log(`server got: ${msg} from ${rinfo.address}:${rinfo.port}`);
server.send('这是来自于服务端的回复', rinfo.port, rinfo.address);
});
server.bind(41235);
在message
回调中接收到来自其他socket所传递过来的消息,并立即通过send往源socket的地址以及端口上发送数据,来实现"反向"
调用的机制!
1、new Socket()的过程
来分析关于
new Socket()
的一个过程,从而来更好的理解关于dgram
如何来创建并维护这个socket并保持两者之间的通讯!
- 将自身作为参数,调用了EventEmitter方法,并直接继承于EventEmitter的原型,使得拥有了相关的on/emit等api;
- 创建 UDP对象,存储在
_handle
变量中,该对象继承于HandleWrap
,而HandleWrap
继承于AsyncWrap
,AsyncWrap
主要提供相关的ref/unref方法操作,而HandleWrap
则提供对应的绑定端口以及监听读写数据的动作; - 在调用Socket构造方法的时候,如果传递了callback的话,则将直接调用
on('message')
方法,并将这个回调callback作为on方法的监听回调,这也就说明了为什么一 消息,就会调用这个回调方法了; - 在此之后,已完成了Socket对象的创建,并初始化了该Socket对象中的相关变量,特别是
[kStateSymbol]
变量,后面将会用到,这里用Symbol代表独一无二!
2、bind与send的过程
创建完成一个
Socket
对象之后,需要对该对象进行一个绑定监听操作操作,以及发送消息的动作!
- bind设置监听的过程:
- bind()方法的过程,无非是针对已经初始化的Socket对象进行自身变量的相关初始化赋值动作,并进行对应的校验判断,然后调用
startListener
方法; - 从
_handle
变量中取出之前已经创建好的UDP对象,并对其设置onMessage
、onError
监听事件,当底层事件触发的时候,将调用对应已设置好的监听事件; - 调用
_handle
的变量rewStart底层方法,表示开始进入监听动作,并设置对应的状态,然后触发listening发方法
- bind()方法的过程,无非是针对已经初始化的Socket对象进行自身变量的相关初始化赋值动作,并进行对应的校验判断,然后调用
- send发送数据的过程:
- 从socket对象中获取之前已经初始化好的
_handle
对象,利用该对象来进行一个底层之间的通讯
- 从socket对象中获取之前已经初始化好的
dgram的相关监听以及API方法
提及到的基本上是关于UDP单播的方式:即是地址为单一目标的传播方式,用于两个主机之间的端对端的通讯,下面来介绍关于udp广播与组播
广播,顾名思义,也就是地址为网络中所有目标的传播方式,与单播的区别就是IP不同,广播使用
广播地址
,将消息发送到某一广播网络上的所有目标设备!组播,即对统一网络中的设备进行分组,只有一组内的网络设备可以收到数据,在广域网上组播的时候,交换机和路由器只向需要获取数据的主机复制并转发数据