当前位置:首页 > 日记 > 正文

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

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

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端口发送数据报,该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数据报,该组网络下的所有主机都会受到影响,主机根据端口号来判断是否丢弃该数据。组播过程原理与广播类似。

3、dgram模块API介绍

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

3、UDP单播实现

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

服务端:

const dgram = require('dgram');const server = dgram.createSocket('udp4');server.on('close',()=>{  console.log('socket已关闭');});server.on('error',(err)=>{  console.log(err);});server.on('listening',()=>{  console.log('socket正在监听中...');});server.on('message',(msg,rinfo)=>{  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);  server.send('exit',rinfo.port,rinfo.address)});server.bind('8060');

客户端:

const dgram = require('dgram');const client = dgram.createSocket('udp4');client.on('close',()=>{  console.log('socket已关闭');});client.on('error',(err)=>{  console.log(err);});client.on('message',(msg,rinfo)=>{  if(msg=='exit') client.close();  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);});client.send(`hello`,8060,'1.1.1.69');

3、UDP广播实现

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

IP:149.88.160.58
mask:11111111.11111111.11000000.00000000
IP&MASK得到网络地址: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 = require('dgram');const server = dgram.createSocket('udp4');server.on('close',()=>{  console.log('socket已关闭');});server.on('error',(err)=>{  console.log(err);});server.on('listening',()=>{  console.log('socket正在监听中...');  server.setBroadcast(!0);//开启广播  server.setTTL(128);  server.send('大家好啊,我是服务端.',8061,'1.1.1.255');});server.on('message',(msg,rinfo)=>{  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);});server.bind('8060','1.1.1.69');

客户端:

const dgram = require('dgram');const client = dgram.createSocket('udp4');client.on('close',()=>{  console.log('socket已关闭');});client.on('error',(err)=>{  console.log(err);});client.on('listening',()=>{  console.log('socket正在监听中...');});client.on('message',(msg,rinfo)=>{  console.log(`receive message from ${rinfo.address}:${rinfo.port}:${msg}`);});client.bind(8061,'1.1.1.69');

3、UDP组播实现

组播地址是实现UDP组播的关键,因此了解组播地址是重点。什么是组播地址?IANA将D类地址(224.0.0.0-239.255.255.255)分配给IP组播,用来标识一个IP组播组,由IGMP(组管理协议)协议维护组成员关系,其中:

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

224.0.1.0~224.0.1.255是公用组播地址,可以用于Internet;

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

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

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

dgram模块的addMembership()方法将socket加入组播组中,dropMembership()方法退出组播组。下面以组播地址224.100.100.100来实现UDP组播,如下所示:

服务端:

const dgram = require('dgram');const server = dgram.createSocket('udp4');const multicastAddr = '224.100.100.100';server.on('close',()=>{  console.log('socket已关闭');});server.on('error',(err)=>{  console.log(err);});server.on('listening',()=>{  console.log('socket正在监听中...');  server.addMembership(multicastAddr);  server.setMulticastTTL(128);  setInterval(()=>{    sendMsg();  },1500);});server.on('message',(msg,rinfo)=>{  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);});function sendMsg(){  server.send('大家好啊,我是服务端.',8061,multicastAddr);}server.bind('8060','1.1.1.69');

客户端:

const dgram = require('dgram');const client = dgram.createSocket('udp4');const multicastAddr = '224.100.100.100';client.on('close',()=>{  console.log('socket已关闭');});client.on('error',(err)=>{  console.log(err);});client.on('listening',()=>{  console.log('socket正在监听中...');  client.addMembership(multicastAddr);});client.on('message',(msg,rinfo)=>{  console.log(`receive message from ${rinfo.address}:${rinfo.port}:${msg}`);});client.bind(8061,'1.1.1.69');

另外UDP内网穿透相关的内容,大家也可自行了解一下。希望对大家的学习有所帮助,也希望大家多多支持。

相关文章

Photoshop CC 2018内置滤镜camera

Photoshop CC 2018内置滤镜camera

分享,滤镜,一键,技巧,电脑软件,今天给大家分享使用Photoshop CC 2018的内置滤镜camera raw一键磨皮小技巧,它的速度非常非常快,可以说真正的有效步骤只有一步,适用于对于非商业用途、不要求太多细节的图片,效果还是很棒的。这个分享涉及到camer…

ppt2010有布尔运算吗

ppt2010有布尔运算吗

布尔运算,方法,绘制图形,电脑软件,  图形的布尔运算,说白了就是图形之间的加、减法。在其他图形处理软件中布尔运算很常见,但是ppt中暂时还没有把图形的布尔运算放在菜单中。下面给大家分享PPT2010绘制图形布尔运算的方法,欢迎大家来到学习…

解决安装WampServer时提示缺少msvc

解决安装WampServer时提示缺少msvc

提示,文件,安装,电脑软件,WampServer,今天开始学习PHP,对于初学者来说,我们一定希望从简单的开始,所以,从集成环境非常好的WampServer的安装开始.1、下载WampServer安装程序,安装完毕后会出现一个错误.如下:2、这是因为你的电脑缺少c++环境。你…

vue-resource 拦截器使用详解

vue-resource 拦截器使用详解

拦截器,详解,电脑软件,vue,resource,在vue项目使用vue-resource的过程中,临时增加了一个需求,需要在任何一个页面任何一次http请求,增加对token过期的判断,如果token已过期,需要跳转至登录页面。如果要在每个页面中的http请求操作中添加一次判断…

浅谈nodejs中的类定义和继承的套路

浅谈nodejs中的类定义和继承的套路

继承,类定义,套路,浅谈,电脑软件,javascript是一门极其灵活的语言。灵活到你无法忍受!我个人喜欢强类型的语言,例如c/c++,c#等。但是js代表着未来,所以需要学习。js中类定义以及继承有n多种方式,现在来学习一下nodejs类定义以及继承的固定套路…

Asp.net 中使用GridView控件实现Ch

Asp.net 中使用GridView控件实现Ch

单选,控件,电脑软件,net,Asp,在GridView控件中,第0列有放一个CheckBox控件,现想实现对CheckBox进行单选。先看看效果:在ASPX页面,可以这样做:有一点注意的是需要使用OnRowCreated事件。在ASPX.cs代码里,实现上面OnRowCreated事件:上面有个事件委托…

IE11下使用canvas.toDataURL报Secu

IE11下使用canvas.toDataURL报Secu

解决方法,错误,电脑软件,canvas,SecurityError,发现问题最近在项目中用到了 canvas 的 toDataURL 方法来获取图片的 base64 格式数据,用以上传到后台。由于之前也遇到过 canvas 被跨域图片污染不能获取数据的坑,因此这回一开始就机智的把 cro…

excel表格统计数据教程

excel表格统计数据教程

教程,统计数据,表格,电脑软件,excel,  Excel中数据该如何统计呢?接下来是小编为大家带来的excel表格统计数据教程,供大家参考。excel表格统计数据教程:  统计数据步骤1:菜单栏——公式(03版的是在数据里面可以找到)—&mdas…

Word2003如何做电子报

Word2003如何做电子报

方法,板报,如何做,电子报,电脑软件,  利用word2003制作电子板报前,要思考主题,收集素材,之后进行制作。那么大家知道怎样做电子报吗?下面是小编给大家整理的一些有关word2003制作电子板报的方法,希望看完本教程的朋友都能学会Word技巧并运用起…

excel2007使用时卡顿的解决方法exc

excel2007使用时卡顿的解决方法exc

解决方法,电脑软件,时卡顿,strong,  Microsoft Office Excel 2007 打开 Excel 2003 创建的文件在筛选时出现卡顿,要等待几分钟甚至更长时间才会响应,今天,小编就教大家如何解决卡顿的方法。Excel2007使用时卡顿的解决方法excel2007使用时卡…

Asp.net Core 1.1 升级后操作mysql

Asp.net Core 1.1 升级后操作mysql

操作,升级,解决办法,电脑软件,net,遇到问题core的版本从1.0升级到1.1,操作mysql数据库,查询数据时遇到MissingMethodException问题,更新、插入操作没有问题。如果你也遇到这个问题,请参照以下步骤进行升级操作。操作步骤及内容如果你的项目已经…

ASP.NET Core 2.0 本地文件操作问

ASP.NET Core 2.0 本地文件操作问

操作,解决方案,本地文件,电脑软件,NET,问题如何在ASP.NET Core 2.0中受限地访问本地目录和文件信息?答案新建一个空项目,修改Startup类,添加访问本地文件所需的服务:public void ConfigureServices(IServiceCollection services){ services.Add…