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 相关文章推荐
基于Jquery+Ajax+Json的高效分页实现代码
Oct 29 Javascript
编写自己的jQuery提示框(Tip)插件
Feb 05 Javascript
简单的JS时钟实例讲解
Jan 13 Javascript
js 将图片连接转换成base64格式的简单实例
Aug 10 Javascript
关于原生js中bind函数的简单实现
Aug 10 Javascript
微信小程序 本地数据读取实例
Apr 27 Javascript
angular2+node.js express打包部署的实战
Jul 27 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
May 05 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
May 26 Javascript
layui数据表格 table.render 报错的解决方法
Sep 29 Javascript
Vue 使用beforeEach实现登录状态检查功能
Oct 31 Javascript
详解Vue的options
May 15 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将向Java靠拢
2006/10/09 PHP
社区(php&&mysql)三
2006/10/09 PHP
php常用ODBC函数集(详细)
2013/06/24 PHP
PHP实现微信公众平台音乐点播
2014/03/20 PHP
Codeigniter发送邮件的方法
2015/03/19 PHP
php中JSON的使用方法
2015/04/30 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
PHP+iframe图片上传实现即时刷新效果
2016/11/18 PHP
YII2框架中actions的作用与使用方法示例
2020/03/13 PHP
js/jQuery简单实现选项卡功能
2014/01/02 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
微信小程序实现图片预览功能
2018/01/31 Javascript
JS实现把一个页面层数据传递到另一个页面的两种方式
2018/08/13 Javascript
JavaScript中将值转换为字符串的五种方法总结
2019/06/06 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
Vue-router 报错NavigationDuplicated的解决方法
2020/03/31 Javascript
vue.js中使用微信扫一扫解决invalid signature问题(完美解决)
2020/04/11 Javascript
jquery实现有过渡效果的tab切换
2020/07/17 jQuery
vue实现移动端input上传视频、音频
2020/08/18 Javascript
javascript实现固定侧边栏
2021/02/09 Javascript
Django使用httpresponse返回用户头像实例代码
2018/01/26 Python
Python图像处理库PIL的ImageFont模块使用介绍
2020/02/26 Python
Django项目创建及管理实现流程详解
2020/10/13 Python
CSS3中background-clip和background-origin的区别示例介绍
2014/03/10 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
快餐公司创业计划书
2014/04/29 职场文书
房地产经营管理专业自荐信
2014/09/02 职场文书
大学生学习计划书
2014/09/15 职场文书
学习退步检讨书
2014/09/28 职场文书
2016年5月份红领巾广播稿
2015/12/21 职场文书
Python Django项目和应用的创建详解
2021/11/27 Python