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 相关文章推荐
js控制表单操作的常用代码小结
Aug 15 Javascript
javascript操作select元素实例分析
Mar 27 Javascript
又一款js时钟!transform实现时钟效果
Aug 15 Javascript
谈谈对JavaScript原生拖放的深入理解
Sep 20 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
详谈表单格式化插件jquery.serializeJSON
Jun 23 jQuery
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
对Layer弹窗使用及返回数据接收的实例详解
Sep 26 Javascript
uni-app 组件里面获取元素宽高的实现
Dec 27 Javascript
《javascript设计模式》学习笔记四:Javascript面向对象程序设计链式调用实例分析
Apr 07 Javascript
vue-router 控制路由权限的实现
Sep 24 Javascript
vue使用transition组件动画效果的实例代码
Jan 28 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
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
Laravel-admin之修改操作日志的方法
2019/09/30 PHP
Mozilla 表达式 __noSuchMethod__
2009/04/05 Javascript
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
jQuery写的日历(包括日历的样式及功能)
2013/04/23 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
AngularJS Bootstrap详细介绍及实例代码
2016/07/28 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
Vue.js对象转换实例
2017/06/07 Javascript
Vue按需加载的具体实现
2017/12/02 Javascript
浅析vue插槽和作用域插槽的理解
2019/04/22 Javascript
js获取对象,数组所有属性键值(key)和对应值(value)的方法示例
2019/06/19 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
微信小程序制作扭蛋机代码实例
2019/09/24 Javascript
如何利用node.js开发一个生成逐帧动画的小工具
2019/12/01 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
python实现感知器算法详解
2017/12/19 Python
python编程嵌套函数实例代码
2018/02/11 Python
python DataFrame获取行数、列数、索引及第几行第几列的值方法
2018/04/08 Python
Django 静态文件配置过程详解
2019/07/23 Python
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
python 基于selectors库实现文件上传与下载
2020/12/31 Python
纯css3无js实现的Android Logo(有简单动画)
2013/01/21 HTML / CSS
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
利用HTML5+CSS3实现3D转换效果实例详解
2017/05/02 HTML / CSS
websocket+sockjs+stompjs详解及实例代码
2018/11/30 HTML / CSS
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
联欢晚会主持词
2014/03/25 职场文书
滞留工资返还协议书
2014/10/19 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
工作简报范文
2015/07/21 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
volatile保证可见性及重排序方法
2022/08/05 Java/Android