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去除数组重复值的五种不同方法
Sep 06 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
javascript实现日期按月份加减
May 15 Javascript
JS使用eval解析JSON的注意事项分析
Nov 14 Javascript
详解js界面跳转与值传递
Nov 22 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
Jan 21 Javascript
单击按钮发送验证码,出现倒计时的简单实例
Mar 17 Javascript
bootstrap select下拉搜索插件使用方法详解
Nov 23 Javascript
Vue单页应用引用单独的样式文件的两种方式
Mar 30 Javascript
vue-cli3.0使用及部分配置详解
Aug 29 Javascript
玩转vue的slot内容分发
Sep 22 Javascript
Vue表单输入绑定的示例代码
Nov 01 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
当海贼王变成JOJO风
2020/03/02 日漫
用PHP实现读取和编写XML DOM代码
2010/04/07 PHP
php和mysql中uft-8中文编码乱码的几种解决办法
2012/04/19 PHP
php实现的递归提成方案实例
2015/11/14 PHP
postfixadmin忘记密码后的修改密码方法详解
2016/07/20 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
跟着JQuery API学Jquery 之二 属性
2010/04/09 Javascript
IE6浏览器下resize事件被执行了多次解决方法
2012/12/11 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
jquery处理json对象
2014/11/03 Javascript
如何在node的express中使用socket.io
2014/12/15 Javascript
JavaScript中getUTCSeconds()方法的使用详解
2015/06/11 Javascript
常用的JQuery函数及功能小结
2016/03/24 Javascript
前端 Vue.js 和 MVVM 详细介绍
2016/12/29 Javascript
JS在浏览器中解析Base64编码图像
2017/02/09 Javascript
jquery mobile实现可折叠的导航按钮
2017/03/11 Javascript
Angular 4 指令快速入门教程
2017/06/07 Javascript
JS实现微信摇一摇原理解析
2017/07/22 Javascript
vue.js的手脚架vue-cli项目搭建的步骤
2017/08/30 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
JS实现关键词高亮显示正则匹配
2018/06/22 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
如何利用javascript接收json信息并进行处理
2020/08/06 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
2020/10/29 Javascript
在VUE中使用lodash的debounce和throttle操作
2020/11/09 Javascript
node koa2 ssr项目搭建的方法步骤
2020/12/11 Javascript
python获取代码运行时间的实例代码
2018/06/11 Python
使用 Supervisor 监控 Python3 进程方式
2019/12/05 Python
python opencv图像处理(素描、怀旧、光照、流年、滤镜 原理及实现)
2020/12/10 Python
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
《中国梦我的梦》小学生演讲稿
2014/08/20 职场文书
学前教育见习总结
2015/06/23 职场文书
小学三年级作文之写景
2019/11/05 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js