udp相关

UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。 UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议

udp所导出的模块

:stars: 关于这个node.js中使用的udp,则是直接使用的dgram模块来实现的,而该模块也比较简单,就一个API + 一个对象,API用于创建这个Socket对象, 通过观察这个模块所导出的api方法,可以发现dgram.createSocket其实就是new Socket()的过程!!

:confused: 那么,什么是dgram的Socket对象?可以用它来作甚?

dgram.createSocket===new Socket()

首先先看一下关于如何使用这个udp模块的, 如 :point_down: 所示: udp通讯例子 :point_up: 这里简单创建了一个"server"以及一个"client",这里要对server端以及client端打上引号,是因为这里的socket并非真正意义上的服务端与客户端,因为在dgram模块中,并无真正意义上的客户端与服务端, 它只是临时的将一个socket当作普通的server对象而已!

:stars: 这里每一个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);

:point_up:message回调中接收到来自其他socket所传递过来的消息,并立即通过send往源socket的地址以及端口上发送数据,来实现"反向"调用的机制!

1、new Socket()的过程

:point_down: 来分析关于new Socket()的一个过程,从而来更好的理解关于dgram如何来创建并维护这个socket并保持两者之间的通讯!

  • 将自身作为参数,调用了EventEmitter方法,并直接继承于EventEmitter的原型,使得拥有了相关的on/emit等api;
  • 创建 :one: UDP对象,存储在_handle变量中,该对象继承于HandleWrap,而HandleWrap继承于AsyncWrapAsyncWrap主要提供相关的ref/unref方法操作,而HandleWrap则提供对应的绑定端口以及监听读写数据的动作;
  • 在调用Socket构造方法的时候,如果传递了callback的话,则将直接调用on('message')方法,并将这个回调callback作为on方法的监听回调,这也就说明了为什么一 :u6709: 消息,就会调用这个回调方法了;
  • 在此之后,已完成了Socket对象的创建,并初始化了该Socket对象中的相关变量,特别是[kStateSymbol]变量,后面将会用到,这里用Symbol代表独一无二!

2、bind与send的过程

创建完成一个Socket对象之后,需要对该对象进行一个绑定监听操作操作,以及发送消息的动作!

  • bind设置监听的过程:
    • bind()方法的过程,无非是针对已经初始化的Socket对象进行自身变量的相关初始化赋值动作,并进行对应的校验判断,然后调用startListener方法;
    • _handle变量中取出之前已经创建好的UDP对象,并对其设置onMessageonError监听事件,当底层事件触发的时候,将调用对应已设置好的监听事件;
    • 调用_handle的变量rewStart底层方法,表示开始进入监听动作,并设置对应的状态,然后触发listening发方法
  • send发送数据的过程:
    • 从socket对象中获取之前已经初始化好的_handle对象,利用该对象来进行一个底层之间的通讯

dgram的相关监听以及API方法

datagram模块

:point_up: 提及到的基本上是关于UDP单播的方式:即是地址为单一目标的传播方式,用于两个主机之间的端对端的通讯,下面来介绍关于udp广播组播

广播,顾名思义,也就是地址为网络中所有目标的传播方式,与单播的区别就是IP不同,广播使用广播地址,将消息发送到某一广播网络上的所有目标设备!

组播,即对统一网络中的设备进行分组,只有一组内的网络设备可以收到数据,在广域网上组播的时候,交换机和路由器只向需要获取数据的主机复制并转发数据

results matching ""

    No results matching ""