欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

node.js基于dgram數(shù)據(jù)報(bào)模塊創(chuàng)建UDP服務(wù)器和客戶端操作示例

 更新時(shí)間:2020年02月12日 08:39:22   作者:懷素真  
這篇文章主要介紹了node.js基于dgram數(shù)據(jù)報(bào)模塊創(chuàng)建UDP服務(wù)器和客戶端操作,結(jié)合實(shí)例形式分析了node.js使用dgram數(shù)據(jù)報(bào)模塊創(chuàng)建UDP服務(wù)器和客戶端,以及進(jìn)行UDP廣播、組播相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了node.js基于dgram數(shù)據(jù)報(bào)模塊創(chuàng)建UDP服務(wù)器和客戶端操作。分享給大家供大家參考,具體如下:

node.js中 dgram 模塊提供了udp數(shù)據(jù)包的socket實(shí)現(xiàn),可以方便的創(chuàng)建udp服務(wù)器和客戶端。

一、創(chuàng)建UDP服務(wù)器和客戶端

服務(wù)端:

const dgram = require('dgram');
//創(chuàng)建upd套接字
//參數(shù)一表示套接字類型,'udp4' 或 'udp6'
//參數(shù)二表示事件監(jiān)聽函數(shù),'message' 事件監(jiān)聽器
let server = dgram.createSocket('udp4');
//綁定端口和主機(jī)地址
server.bind(8888, '127.0.0.1');
//有新數(shù)據(jù)包被接收時(shí),觸發(fā)
server.on('message', function (msg, rinfo) {
  //msg表示接收到的數(shù)據(jù)
  //rinfo表示遠(yuǎn)程主機(jī)的地址信息
  console.log('接收到的數(shù)據(jù) : ', msg.toString());
  console.log(rinfo);
  //發(fā)送數(shù)據(jù),如果發(fā)送數(shù)據(jù)之前沒有綁定過地址和端口,則會(huì)隨機(jī)分配端口。
  //參數(shù)一表示,要發(fā)送的數(shù)據(jù) string或buffer
  //參數(shù)二表示,發(fā)送數(shù)據(jù)的偏移量
  //參數(shù)三表示,發(fā)送數(shù)據(jù)的字節(jié)數(shù)
  //參數(shù)四表示,目標(biāo)端口
  //參數(shù)五表示,目標(biāo)主機(jī)名或IP地址
  //參數(shù)六表示,消息發(fā)送完畢后的回調(diào)函數(shù)
  server.send('你好', 0, 6, rinfo.port, rinfo.address);
});
//開始監(jiān)聽數(shù)據(jù)包時(shí),觸發(fā)
server.on('listening', function () {
  console.log('監(jiān)聽開始');
});
//使用 close() 關(guān)閉socket之后觸發(fā)
server.on('close', function () {
  console.log('關(guān)閉');
});
//發(fā)生錯(cuò)誤時(shí)觸發(fā)
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發(fā)送數(shù)據(jù)
client.send('你好', 0, 6, 8888, '127.0.0.1', function (error, bytes) {
  if (error) {
    console.log(error);
  }
  console.log(`發(fā)送了 ${bytes} 個(gè)字節(jié)數(shù)據(jù)`);
});

udp中服務(wù)器與客戶端并沒有嚴(yán)格的劃分,既可以作為服務(wù)器接收數(shù)據(jù)處理數(shù)據(jù),也可以像客戶端一樣請(qǐng)求數(shù)據(jù),彼此之間相對(duì)獨(dú)立。

二、通過UDP服務(wù)器進(jìn)行廣播

我們知道一個(gè)IP地址是由網(wǎng)絡(luò)地址和主機(jī)地址組成的,而廣播IP的主機(jī)位全為1,當(dāng)我們向一個(gè)廣播IP發(fā)送數(shù)據(jù)時(shí),則該數(shù)據(jù)將分發(fā)給所有同網(wǎng)段的主機(jī)。

服務(wù)端:

const dgram = require('dgram');
let server = dgram.createSocket('udp4');
//注意setBroadcast()必須在綁定socket成功后才能調(diào)用
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('廣播數(shù)據(jù)');
setInterval(function () {
  //向廣播IP發(fā)送數(shù)據(jù)
  //注意客戶端監(jiān)聽的端口要與這里的端口一致,不然無法接收到廣播
  server.send(buf, 0, buf.length, 6666, '192.168.1.255', function (error, bytes) {
    if (error) {
      console.log(error);
    }
    console.log(`發(fā)送 ${bytes} 個(gè)字節(jié)數(shù)據(jù)`);
  });
}, 3000);

客戶端:

const dgram = require('dgram');
let client = dgram.createSocket('udp4');
//如果監(jiān)聽不到廣播數(shù)據(jù),設(shè)置成 0.0.0.0 看看
client.bind(6666, '192.168.1.111');
client.on('message', function (msg, rinfo) {
  console.log(msg.toString());
});

三、通過UDP進(jìn)行組播

組播就是將網(wǎng)絡(luò)中的主機(jī)進(jìn)行邏輯上的分組,向一個(gè)組播地址發(fā)送數(shù)據(jù),該組下的所有主機(jī)都會(huì)收到數(shù)據(jù)。

實(shí)現(xiàn)組播,并不是直接把數(shù)據(jù)發(fā)送給目標(biāo)地址,而是將數(shù)據(jù)發(fā)送給組播主機(jī),然后分發(fā)給組內(nèi)的所有成員。

在網(wǎng)絡(luò)中,使用D類地址作為組播地址,范圍是 224.0.0.0 - 239.255.255.255。

分為四類:

1、224.0.0.0 ~ 224.0.0.255 地址224.0.0.0保留不做分配,其它供路由協(xié)議使用。

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

3、224.0.2.0 ~ 238.255.255.255 為用戶可用的組播地址(臨時(shí)組地址),全網(wǎng)范圍內(nèi)有效。

4、239.0.0.0 ~ 239.255.255.255 為本地管理組播地址,僅在特定的本地范圍內(nèi)有效。

通過 addMembership() 將 socket 加入組播中,dropMembership() 方法退出組播。

服務(wù)端:

const dgram = require('dgram');
//組播地址
const multicastAddr = '224.1.1.1';
let server = dgram.createSocket('udp4');
//注意setMulticastLoopback()要在綁定成功后設(shè)置
server.bind(8888, '192.168.1.102', function () {
  //設(shè)置數(shù)據(jù)包的生存時(shí)間
  server.setMulticastTTL(128);
  //將socket加入組播組中
  server.addMembership(multicastAddr);
  //開啟組播
  server.setMulticastLoopback(true);
});
server.on('message', function (msg, rinfo) {
  console.log(msg.toString());
});
let buf = Buffer.from('組播數(shù)據(jù)');
setInterval(function () {
  //向組播IP發(fā)送數(shù)據(jù)
  //注意,客戶端監(jiān)聽的端口要與這里一致
  server.send(buf, 0, buf.length, 6666, multicastAddr, function (error, bytes) {
    console.log(`發(fā)送 ${bytes} 字節(jié)數(shù)據(jù)`);
  });
}, 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());
});

希望本文所述對(duì)大家node.js程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • nodejs 使用 js 模塊的方法實(shí)例詳解

    nodejs 使用 js 模塊的方法實(shí)例詳解

    這篇文章主要介紹了nodejs 使用 js 模塊的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2018-12-12
  • nodejs中模塊定義實(shí)例詳解

    nodejs中模塊定義實(shí)例詳解

    這篇文章主要介紹了nodejs中模塊定義方法,結(jié)合實(shí)例形式分析了nodejs模塊的原理、常見模塊及相應(yīng)的定義方法,需要的朋友可以參考下
    2017-03-03
  • node.js+postman+mongodb搭建測(cè)試注冊(cè)接口的實(shí)現(xiàn)

    node.js+postman+mongodb搭建測(cè)試注冊(cè)接口的實(shí)現(xiàn)

    本文主要介紹了node.js+postman+mongodb搭建測(cè)試注冊(cè)接口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Node.js進(jìn)階之核心模塊https入門

    Node.js進(jìn)階之核心模塊https入門

    在nodejs中,提供了 https 這個(gè)模塊來完成 HTTPS 相關(guān)功能。這篇文章主要介紹了Node.js進(jìn)階之核心模塊https入門,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Node.js折騰記一:讀指定文件夾,輸出該文件夾的文件樹詳解

    Node.js折騰記一:讀指定文件夾,輸出該文件夾的文件樹詳解

    這篇文章主要介紹了Node.js讀指定文件夾輸出該文件夾文件樹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • NodeJS實(shí)現(xiàn)單點(diǎn)登錄原理解析

    NodeJS實(shí)現(xiàn)單點(diǎn)登錄原理解析

    隨著公司業(yè)務(wù)的增多,必然會(huì)產(chǎn)生各個(gè)不同的系統(tǒng),如果每個(gè)系統(tǒng)都需要單獨(dú)登錄的話就會(huì)很不方便,所以這個(gè)時(shí)候單點(diǎn)登錄會(huì)很方便,今天通過本文給大家講解NodeJS實(shí)現(xiàn)單點(diǎn)登錄原理解析,感興趣的朋友一起看看吧
    2022-05-05
  • 詳解NodeJs支付寶移動(dòng)支付簽名及驗(yàn)簽

    詳解NodeJs支付寶移動(dòng)支付簽名及驗(yàn)簽

    本文主要介紹了NodeJs支付寶移動(dòng)支付簽名及驗(yàn)簽的方法,具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • 基于node的tcp客戶端和服務(wù)端的簡(jiǎn)單通信

    基于node的tcp客戶端和服務(wù)端的簡(jiǎn)單通信

    通過Nodejs,我們可以快速地搭建一個(gè)簡(jiǎn)單的Web服務(wù)器,實(shí)現(xiàn)服務(wù)端與客戶端的簡(jiǎn)單通信,本文主要介紹了基于node的tcp客戶端和服務(wù)端的簡(jiǎn)單通信,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Nodejs 發(fā)布自己的npm包并制作成命令行工具的實(shí)例講解

    Nodejs 發(fā)布自己的npm包并制作成命令行工具的實(shí)例講解

    今天小編就為大家分享一篇Nodejs 發(fā)布自己的npm包并制作成命令行工具的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • nodejs實(shí)例解析(輸出hello world)

    nodejs實(shí)例解析(輸出hello world)

    本文主要介紹nodejs實(shí)例解析:輸出hello world的完整過程。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01

最新評(píng)論