node.js基于dgram数据报模块创建UDP服务器和客户端操作示例


Posted in Javascript onFebruary 12, 2020

本文实例讲述了node.js基于dgram数据报模块创建UDP服务器和客户端操作。分享给大家供大家参考,具体如下:

node.js中 dgram 模块提供了udp数据包的socket实现,可以方便的创建udp服务器和客户端。

一、创建UDP服务器和客户端

服务端:

const dgram = require('dgram');
//创建upd套接字
//参数一表示套接字类型,'udp4' 或 'udp6'
//参数二表示事件监听函数,'message' 事件监听器
let server = dgram.createSocket('udp4');
//绑定端口和主机地址
server.bind(8888, '127.0.0.1');
//有新数据包被接收时,触发
server.on('message', function (msg, rinfo) {
  //msg表示接收到的数据
  //rinfo表示远程主机的地址信息
  console.log('接收到的数据 : ', msg.toString());
  console.log(rinfo);
  //发送数据,如果发送数据之前没有绑定过地址和端口,则会随机分配端口。
  //参数一表示,要发送的数据 string或buffer
  //参数二表示,发送数据的偏移量
  //参数三表示,发送数据的字节数
  //参数四表示,目标端口
  //参数五表示,目标主机名或IP地址
  //参数六表示,消息发送完毕后的回调函数
  server.send('你好', 0, 6, rinfo.port, rinfo.address);
});
//开始监听数据包时,触发
server.on('listening', function () {
  console.log('监听开始');
});
//使用 close() 关闭socket之后触发
server.on('close', function () {
  console.log('关闭');
});
//发生错误时触发
server.on('error', function (err) {
  console.log(err);
});

客户端:

const dgram = require('dgram');
let client = dgram.createSocket('udp4');
client.bind(3333, '127.0.0.1');
client.on('message', function (msg, rinfo) {
  console.log(msg.toString());
});
client.on('error', function (err) {
  console.log(err);
});
//给8888端口的UDP发送数据
client.send('你好', 0, 6, 8888, '127.0.0.1', function (error, bytes) {
  if (error) {
    console.log(error);
  }
  console.log(`发送了 ${bytes} 个字节数据`);
});

udp中服务器与客户端并没有严格的划分,既可以作为服务器接收数据处理数据,也可以像客户端一样请求数据,彼此之间相对独立。

二、通过UDP服务器进行广播

我们知道一个IP地址是由网络地址和主机地址组成的,而广播IP的主机位全为1,当我们向一个广播IP发送数据时,则该数据将分发给所有同网段的主机。

服务端:

const dgram = require('dgram');
let server = dgram.createSocket('udp4');
//注意setBroadcast()必须在绑定socket成功后才能调用
server.bind(8888, '192.168.1.102', function () {
  //启用广播
  server.setBroadcast(true);
  server.setTTL(128);
});
server.on('message', function (msg, rinfo) {
  console.log(msg.toString());
  console.log(rinfo);
});
let buf = Buffer.from('广播数据');
setInterval(function () {
  //向广播IP发送数据
  //注意客户端监听的端口要与这里的端口一致,不然无法接收到广播
  server.send(buf, 0, buf.length, 6666, '192.168.1.255', function (error, bytes) {
    if (error) {
      console.log(error);
    }
    console.log(`发送 ${bytes} 个字节数据`);
  });
}, 3000);

客户端:

const dgram = require('dgram');
let client = dgram.createSocket('udp4');
//如果监听不到广播数据,设置成 0.0.0.0 看看
client.bind(6666, '192.168.1.111');
client.on('message', function (msg, rinfo) {
  console.log(msg.toString());
});

三、通过UDP进行组播

组播就是将网络中的主机进行逻辑上的分组,向一个组播地址发送数据,该组下的所有主机都会收到数据。

实现组播,并不是直接把数据发送给目标地址,而是将数据发送给组播主机,然后分发给组内的所有成员。

在网络中,使用D类地址作为组播地址,范围是 224.0.0.0 - 239.255.255.255。

分为四类:

1、224.0.0.0 ~ 224.0.0.255 地址224.0.0.0保留不做分配,其它供路由协议使用。

2、224.0.1.0 ~ 224.0.1.255 公用组播地址,可以用于Internet。

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

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

通过 addMembership() 将 socket 加入组播中,dropMembership() 方法退出组播。

服务端:

const dgram = require('dgram');
//组播地址
const multicastAddr = '224.1.1.1';
let server = dgram.createSocket('udp4');
//注意setMulticastLoopback()要在绑定成功后设置
server.bind(8888, '192.168.1.102', function () {
  //设置数据包的生存时间
  server.setMulticastTTL(128);
  //将socket加入组播组中
  server.addMembership(multicastAddr);
  //开启组播
  server.setMulticastLoopback(true);
});
server.on('message', function (msg, rinfo) {
  console.log(msg.toString());
});
let buf = Buffer.from('组播数据');
setInterval(function () {
  //向组播IP发送数据
  //注意,客户端监听的端口要与这里一致
  server.send(buf, 0, buf.length, 6666, multicastAddr, function (error, bytes) {
    console.log(`发送 ${bytes} 字节数据`);
  });
}, 3000);

客户端:

const dgram = require('dgram');
const multicastAddr = '224.1.1.1';
let client = dgram.createSocket('udp4');
client.bind(6666, '0.0.0.0', function() {
  //将socket加入组播组中
  client.addMembership(multicastAddr);
});
client.on('message', function (msg, rinfo) {
  console.log(msg.toString());
});

希望本文所述对大家node.js程序设计有所帮助。

Javascript 相关文章推荐
日期函数扩展类Ver0.1.1
Sep 07 Javascript
JavaScript 三种创建对象的方法
Oct 16 Javascript
jquery trigger伪造a标签的click事件取代window.open方法
Jun 23 Javascript
移动端JQ插件hammer使用详解
Jul 03 Javascript
用js编写的简单的计算器代码程序
Aug 04 Javascript
js实现随屏幕滚动的带缓冲效果的右下角广告代码
Sep 04 Javascript
微信小程序 http请求详细介绍
Oct 09 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
Jul 11 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
Aug 28 Javascript
使用JavaScript实现一个小程序之99乘法表
Sep 21 Javascript
vue中路由跳转不计入history的操作
Sep 21 Javascript
Vue如何实现验证码输入交互
Dec 07 Vue.js
解决三元运算符 报错“SyntaxError: can''t assign to conditional expression”
Feb 12 #Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 #Javascript
浅析vue-router实现原理及两种模式
Feb 11 #Javascript
vue-socket.io跨域问题有效解决方法
Feb 11 #Javascript
Vue开发中遇到的跨域问题及解决方法
Feb 11 #Javascript
Vue data的数据响应式到底是如何实现的
Feb 11 #Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 #Javascript
You might like
Smarty结合Ajax实现无刷新留言本实例
2007/01/02 PHP
深入mysql_fetch_row()与mysql_fetch_array()的区别详解
2013/06/05 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
网站页面自动跳转实现方法PHP、JSP(下)
2010/08/01 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
JS+flash实现chrome和ie浏览器下同时可以复制粘贴
2013/09/22 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
JavaScript实现定时隐藏与显示图片的方法
2015/08/06 Javascript
Nodejs中的this详解
2016/03/26 NodeJs
BooStrap对导航条的改造实践小结
2016/09/21 Javascript
easyUI combobox实现联动效果
2017/01/17 Javascript
微信小程序实现获取自己所处位置的经纬度坐标功能示例
2017/11/30 Javascript
Node.js创建HTTP文件服务器的使用示例
2018/05/11 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
JS轮播图的实现方法2
2020/08/25 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
Python中请使用isinstance()判断变量类型
2014/08/25 Python
Python实现网站注册验证码生成类
2017/06/08 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
Python实现快速傅里叶变换的方法(FFT)
2018/07/21 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python + Flask 实现简单的验证码系统
2019/10/01 Python
让Django的BooleanField支持字符串形式的输入方式
2020/05/20 Python
不同浏览器对CSS3和HTML5的支持状况
2009/10/31 HTML / CSS
设计师家具购买和委托在线市场:Viyet
2016/11/16 全球购物
全球知名的珠宝首饰品牌:Kay Jewelers
2018/02/11 全球购物
美国最大婚纱连锁店运营商:David’s Bridal
2019/03/12 全球购物
日本订房网站,预订日本星级酒店/温泉旅馆:Relux(支持中文)
2020/01/03 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
进口业务员岗位职责
2014/04/06 职场文书
党员自我评价2015
2015/03/03 职场文书
惹女朋友生气检讨书
2015/05/06 职场文书
小学大队长竞选稿
2015/11/20 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
动漫APP软件排行榜前十名,半次元上榜,第一款由腾讯公司推出
2022/03/18 杂记