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 相关文章推荐
Prototype Array对象 学习
Jul 19 Javascript
javascript 静态对象和构造函数的使用和公私问题
Mar 02 Javascript
jQuery学习笔记之jQuery原型属性和方法
Jun 09 Javascript
jQuery简单实现遍历数组的方法
Apr 14 Javascript
Javascript同时声明一连串(多个)变量的方法
Jan 23 Javascript
详解vue2.0组件通信各种情况总结与实例分析
Mar 22 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
Nov 21 Javascript
vue+iview/elementUi实现城市多选
Mar 28 Javascript
vue单应用在ios系统中实现微信分享功能操作
Sep 07 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
Nov 06 Javascript
解决vuex刷新数据消失问题
Nov 12 Javascript
详解JSON.parse和JSON.stringify用法
Feb 18 Javascript
解决三元运算符 报错“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
Http 1.1 Etag 与 Last-Modified提高php效率
2008/01/10 PHP
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
PHP语法自动检查的Vim插件
2014/08/11 PHP
php获取textarea的值并处理回车换行的方法
2014/10/20 PHP
Smarty简单生成表单元素的方法示例
2016/05/23 PHP
PHP读取大文件末尾N行的高效方法推荐
2016/06/03 PHP
Thinkphp 5.0实现微信企业付款到零钱
2018/09/30 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
基于jquery实现的一个选择中国大学的弹框 (数据、步骤、代码)
2012/07/26 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
jQuery实现常见的隐藏与展示列表效果示例
2018/06/04 jQuery
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
举例讲解Python中is和id的用法
2015/04/03 Python
Python的函数的一些高阶特性
2015/04/27 Python
Python IDLE入门简介
2017/12/08 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
Python 获取指定文件夹下的目录和文件的实现
2019/08/30 Python
python中的socket实现ftp客户端和服务器收发文件及md5加密文件
2020/04/01 Python
Python+kivy BoxLayout布局示例代码详解
2020/12/28 Python
CSS3制作炫酷的自定义发光文字
2016/03/28 HTML / CSS
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
BSTN意大利:德国街头和运动文化高品质商店
2020/12/22 全球购物
汽车检测与维修专业求职信
2013/10/30 职场文书
外贸业务员的岗位职责
2013/11/23 职场文书
药学职务聘任书
2014/03/29 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
会计师事务所实习证明
2014/11/16 职场文书
2014年志愿者工作总结
2014/11/20 职场文书
党支部工作总结2015
2015/04/01 职场文书
法定代表人身份证明书
2015/06/18 职场文书
订货会主持词
2015/07/01 职场文书