宝哥软件园

Node.js dgram模块实现的UDP通信示例代码

编辑:宝哥软件园 来源:互联网 时间:2021-09-03

1.什么是UDP?

这里简单介绍一下,UDP,即用户数据报协议,一种无连接的传输层协议,提供不可靠的消息服务。UDP协议利用端口号为不同的应用预留自己的数据传输通道,这一点非常重要。与TCP相比,它占用的资源更少,传输速度更快。

2.了解UDP单播、广播和多播

单播:将UDP数据报发送到单播地址时,数据报只能由指定的IP主机接收,同一子网下的其他主机不会接收到数据报。单播过程(假设子网地址为192.168.10,子网下有两台主机:192.168.10.2、192.168.10.3,向192.168.10.2发送数据报)

1.向主机192.168.10.2的8060端口发送数据报,通过以太网中的ARP将IP数据报的目标IP解析为MAC地址,然后将MAC地址设置为目标地址发送出去。

2.当子网下的主机以太网接口看到数据帧时,它会比较自己的MAC地址,如果不同,它会忽略数据帧。

3.直到192.168.10.2,当主机看到数据帧,发现MAC一致,就读入数据帧,然后在IP层比较目标IP和原生IP,在UDP层比较端口号是否一致,最后收到数据帧。

广播:将UDP数据报发送到一个广播地址,广播网络中的所有主机都会受到影响,主机会根据端口号判断是否丢弃数据。广播过程(假设子网地址为192.168.10,该网络的广播地址为192.168.10.255,该子网下有两台主机:192.168.10.2、192.168.10.3,航向192.168.10.3

1.在8060向192.168.10.255的主机端口发送一个数据报,通过以太网中的ARP将IP数据报的目标IP解析为MAC地址,然后将MAC地址设置为目标地址发送出去。

2.192.168.10.2和192.168.10.3的主机接口将与此广播地址成功匹配。直到数据报进入传输层,根据端口是否匹配,判断是否丢弃数据。如果端口是8060,数据将被保留,否则数据将被丢弃。

组播:将UDP数据报发送到一个组播地址,这组网络中的所有主机都会受到影响,主机会根据端口号判断是否丢弃数据。多播过程的原理类似于广播。

3.dgram模块应用编程接口介绍

该模块用于创建UDP数据报套接字,并继承事件发射器。该模块的应用编程接口如下:

3.UDP单播实现

上面已经提到了单播的原理,这里就不描述了。

服务器端:

const dgram=require(' dgram ');const server=dgram . CreateSocket(' UDP 4 ');Server.on ('close ',)={ console . log(' socket closed ');});server.on('error ',(err)={ console . log(err);});Server.on('侦听',()={console.log('套接字正在侦听.');});server.on('message ',(msg,rinfo)={ console.log(`接收来自$ { rinfo . address } : $ { rinfo . port }的消息');server.send('exit ',rinfo.port,rinfo . address)});server . bind(' 8060 ');客户:

const dgram=require(' dgram ');const client=dgram . CreateSocket(' UDP 4 ');Client.on ('close ',)={ console . log(' socket closed ');});client.on('error ',(err)={ console . log(err);});client.on('message ',(msg,rinfo)={ if(msg==' exit ')client . close();console.log(`接收来自$ { rinfo . address } : $ { rinfo . port }的消息`);});client.send(`hello `,8060,' 1 . 1 . 1 . 69 ');3.UDP广播的实现

要实现UDP广播,必须知道广播地址。如何计算广播地址?您可以使用ipconfig(windows)或ifconfig(*unix)获取ip地址和掩码地址,然后使用ip地址和掩码子网掩码获取网络地址,其中主机位都是1,即广播地址,例如:

Ip :149.88.160.58掩码k :1111111111 . 11100000 . 000000 IP掩码获取网络地址:149.88.128.0/18网络号表示所有主机位都是0,即149.88。

接着实现用户数据报协议(用户数据报协议)广播,我机子的互联网协议(互联网协议)为1.1.1.69,掩码为255.255.255.0,因此广播地址为1.1.1.255,服务端向广播地址的8061端口发送数据报,客户端绑定本机的8061端口,如下所示:

服务端:

const dgram=require(' dgram ');const server=dgram。create socket(' UDP 4 ');server.on('close ',()={ console.log('socket已关闭');});server.on('error ',(err)={ console。日志(err);});服务器. on('侦听,()={ console.log('套接字正在监听中.');server.setBroadcast(!0);//开启广播服务器。settl(128);server.send('大家好啊,我是服务端.',8061,'1.1.1.255');});server.on('message ',(msg,rinfo)={ console . log(` 0接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息');});server.bind('8060,' 1。1 .1 .69 ');客户端:

const dgram=require(' dgram ');const client=dgram。create socket(' UDP 4 ');client.on('close ',()={ console.log('socket已关闭');});client.on('error ',(err)={ console。日志(err);});client.on('侦听,()={ console.log('socket正在监听中.');});client.on('message ',(msg,rinfo)={ console.log(`接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息:$ { msg } `);});client.bind(8061,' 1。1 .1 .69 ');3、UDP组播实现

组播地址是实现用户数据报协议(用户数据报协议)组播的关键,因此了解组播地址是重点。什么是组播地址?互联网地址编码分配机构(互联网号码分配机构)将D类地址(224.0.0.0-239.255.255.255)分配给互联网协议(互联网协议)组播,用来标识一个互联网协议(互联网协议)组播组,由IGMP(组管理协议)协议维护组成员关系,其中:

224.0.0.0~224.0.0.255为永久组地址,地址224.0.0.0保留不做分配,其它地址供路由协议使用;

224.0.1.0~224.0.1.255是公用组播地址,可以用于互联网;

224.0.2.0~238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;

239.0.0.0~239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

向组播地址发送数据报,只有该组成员才会接收此数据报。

dgram模块的addMembership()方法将窝加入组播组中,dropMembership()方法退出组播组。下面以组播地址224.100.100.100来实现用户数据报协议(用户数据报协议)组播,如下所示:

服务端:

const dgram=require(' dgram ');const server=dgram。create socket(' UDP 4 ');const多播地址=' 224。100 .100 .100 ';server.on('close ',()={ console.log('socket已关闭');});server.on('error ',(err)={ console。日志(err);});服务器. on('侦听,()={ console.log('套接字正在监听中.');服务器。addmembership(多播地址);服务器。setmulticast TTL(128);setInterval(()={ SendMSg();},1500);});server.on('message ',(msg,rinfo)={ console . log(` 0接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息');});函数sendMsg(){ server.send('大家好啊,我是服务端。8061,multicastAddr);}server.bind('8060 ',1。1 .1 .69 ');客户端:

const dgram=require(' dgram ');const client=dgram。create socket(' UDP 4 ');const多播地址=' 224。100 .100 .100 ';client.on('close ',()={ console.log('socket已关闭');});client.on('error ',(err)={ console。日志(err);});client.on('侦听,()={ console.log('socket正在监听中.');客户。addmembership(多播地址);});client.on('message ',(msg,rinfo)={ console.log(`接收来自$ { rinfo。地址} : $ { rinfo。港口}的消息:$ { msg } `);});client.bind(8061,' 1。1 .1 .69 ');另外用户数据报协议(用户数据报协议)内网穿透相关的内容,大家也可自行了解一下。希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+