节点。js dgram模块实现UDP通信示例代码

  

  

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

  

  

<强>单播:向一个单播地址发送UDP数据报时,数据报只能被指定的IP主机接收,同一子网下的其它主机都不会接收该数据报。单播过程(假设子网地址:192.168.10,该子网下有两台主机:192.168.10.2,192.168.10.3,向192.168.10.2发送数据报)
  

  

1。向主机192.168.10.2的8060端口发送数据报,该IP数据报目标IP在以太网中被ARP解析成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.255发送数据报):
  

  

1。向192.168.10.255主机端口为8060发送数据报,,该IP数据报目标IP在以太网中被ARP解析成MAC地址,然后将此MAC地址设置为目标地址发出去。
  

  

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

  

<强>组 <强>播:向一个组播地址发送UDP数据报,该组网络下的所有主机都会受到影响,主机根据端口号来判断是否丢弃该数据。组播过程原理与广播类似。

  

  

该模块用来创建UDP数据报套接字,继承了EventEmitter,该模块的API如下所示:

  

节点。js dgram模块实现UDP通信示例代码

  

  

单播的原理上面已经说了,这里便不再叙述。
  

  

服务端:

        const dgram=要求(“dgram”);   const服务器=dgram.createSocket (“udp4”);      server.on(“关闭”,()=祝辞{   console.log(“插座已关闭”);   });      server.on(“错误”,(err)=祝辞{   console.log(错);   });      server.on(“倾听”,()=祝辞{   console.log(套接字正在监听中……”);   });      server.on(“消息”,(味精、rinfo)=祝辞{   控制台。日志('收到消息从$ {rinfo.address}: $ {rinfo.port} ');   server.send(‘退出’,rinfo.port rinfo.address)   });      server.bind (' 8060 ');   之前      

客户端:

        const dgram=要求(“dgram”);   const客户=dgram.createSocket (“udp4”);      client.on(“关闭”,()=祝辞{   console.log(“插座已关闭”);   });      client.on(“错误”,(err)=祝辞{   console.log(错);   });   client.on(“消息”,(味精、rinfo)=祝辞{   如果(味精=='退出')client.close ();   控制台。日志('收到消息从$ {rinfo.address}: $ {rinfo.port} ');   });   client.send('你好' 8060 ' 1.1.1.69 ');      之前      

  

要实现UDP广播,就必须知道广播地址,广播地址如何计算呢?可以利用ipconfig (windows)或ifconfig (* unix)得到ip地址和面具掩码地址,然后利用ip地址与面具子网掩码做与操作得到网络地址,网络地址中主机位都为1就是广播地址,举个例子:

  

IP: 149.88.160.58
  面具:11111111.11111111.11000000.00000000
  IP&面具得到网络地址:149.88.128.0/18
  网络号就是主机位全为0,即149.88.10000000.00000000即149.88.128.0
  广播地址就是主机位全为1,即149.88.10111111.11111111即149.88.191.255

  

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

  

服务端:

        const dgram=要求(“dgram”);   const服务器=dgram.createSocket (“udp4”);      server.on(“关闭”,()=祝辞{   console.log(“插座已关闭”);   });      server.on(“错误”,(err)=祝辞{   console.log(错);   });      server.on(“倾听”,()=祝辞{   console.log(套接字正在监听中……”);   server.setBroadcast(0);//开启广播   server.setTTL (128);   server.send(“大家好啊,我是服务端。”,8061年,“1.1.1.255”);   });      server.on(“消息”,(味精、rinfo)=祝辞{   控制台。日志('收到消息从$ {rinfo.address}: $ {rinfo.port} ');   });      server.bind (' 8060 ', ' 1.1.1.69 ');      

节点。js dgram模块实现UDP通信示例代码