最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼

 更新時間:2017年09月26日 17:19:23   作者:SniffRose  
這篇文章主要介紹了Node.js dgram模塊實(shí)現(xiàn)UDP通信示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1、什么是UDP?

這里簡單介紹下,UDP,即用戶數(shù)據(jù)報協(xié)議,一種面向無連接的傳輸層協(xié)議,提供不可靠的消息傳送服務(wù)。UDP協(xié)議使用端口號為不同的應(yīng)用保留其各自的數(shù)據(jù)傳輸通道,這一點(diǎn)非常重要。與TCP相比,占用資源更少,傳輸速度更快。

2、了解UDP單播、廣播和組播

單播:向一個單播地址發(fā)送UDP數(shù)據(jù)報時,數(shù)據(jù)報只能被指定的IP主機(jī)接收,同一子網(wǎng)下的其它主機(jī)都不會接收該數(shù)據(jù)報。單播過程(假設(shè)子網(wǎng)地址:192.168.10,該子網(wǎng)下有兩臺主機(jī):192.168.10.2,192.168.10.3,向192.168.10.2發(fā)送數(shù)據(jù)報)

1.向主機(jī)192.168.10.2的8060端口發(fā)送數(shù)據(jù)報,該IP數(shù)據(jù)報目標(biāo)IP在以太網(wǎng)中被ARP解析成MAC地址,然后將此MAC地址設(shè)置為目標(biāo)地址發(fā)出去。

2.該子網(wǎng)下的主機(jī)以太網(wǎng)接口看到該數(shù)據(jù)幀時,對比自己的MAC地址,如果不一樣,則忽略該數(shù)據(jù)幀。

3.直到192.168.10.2主機(jī)看到該數(shù)據(jù)幀時,發(fā)現(xiàn)MAC一致,則讀入該數(shù)據(jù)幀,然后在IP層對比目標(biāo)IP和本機(jī)IP,在UDP層對比端口號是否一致,最后接收該數(shù)據(jù)幀。

廣播:向一個廣播地址發(fā)送UDP數(shù)據(jù)報,該廣播網(wǎng)絡(luò)下的所有主機(jī)都會受到影響,主機(jī)根據(jù)端口號來判斷是否丟棄該數(shù)據(jù)。廣播過程(假設(shè)子網(wǎng)地址:192.168.10,則該網(wǎng)絡(luò)的廣播地址為:192.168.10.255,該子網(wǎng)下有兩臺主機(jī):192.168.10.2,192.168.10.3,向192.168.10.255發(fā)送數(shù)據(jù)報):

1.向192.168.10.255主機(jī)端口為8060發(fā)送數(shù)據(jù)報,,該IP數(shù)據(jù)報目標(biāo)IP在以太網(wǎng)中被ARP解析成MAC地址,然后將此MAC地址設(shè)置為目標(biāo)地址發(fā)出去。

2.192.168.10.2和192.168.10.3的主機(jī)接口都會和此廣播地址匹配成功,直到該數(shù)據(jù)報進(jìn)入傳輸層時根據(jù)端口是否匹配判斷是否丟棄該數(shù)據(jù),端口為8060的會保留該數(shù)據(jù),否則將數(shù)據(jù)丟棄。

:向一個組播地址發(fā)送UDP數(shù)據(jù)報,該組網(wǎng)絡(luò)下的所有主機(jī)都會受到影響,主機(jī)根據(jù)端口號來判斷是否丟棄該數(shù)據(jù)。組播過程原理與廣播類似。

3、dgram模塊API介紹

該模塊用來創(chuàng)建UDP數(shù)據(jù)報socket,繼承了EventEmitter,該模塊的API如下所示:

3、UDP單播實(shí)現(xiàn)

單播的原理上面已經(jīng)說了,這里便不再敘述。

服務(wù)端:

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('close',()=>{
  console.log('socket已關(guān)閉');
});

server.on('error',(err)=>{
  console.log(err);
});

server.on('listening',()=>{
  console.log('socket正在監(jiān)聽中...');
});

server.on('message',(msg,rinfo)=>{
  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
  server.send('exit',rinfo.port,rinfo.address)
});

server.bind('8060');

客戶端:

const dgram = require('dgram');
const client = dgram.createSocket('udp4');

client.on('close',()=>{
  console.log('socket已關(guān)閉');
});

client.on('error',(err)=>{
  console.log(err);
});
client.on('message',(msg,rinfo)=>{
  if(msg=='exit') client.close();
  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
});
client.send(`hello`,8060,'1.1.1.69');

3、UDP廣播實(shí)現(xiàn)

要實(shí)現(xiàn)UDP廣播,就必須知道廣播地址,廣播地址如何計(jì)算呢?可以利用ipconfig(windows)或ifconfig(*unix)得到ip地址和mask掩碼地址,然后利用ip地址與mask子網(wǎng)掩碼做與操作得到網(wǎng)絡(luò)地址,網(wǎng)絡(luò)地址中主機(jī)位都為1就是廣播地址,舉個例子:

IP:149.88.160.58
mask:11111111.11111111.11000000.00000000
IP&MASK得到網(wǎng)絡(luò)地址:149.88.128.0/18
網(wǎng)絡(luò)號就是主機(jī)位全為0,即149.88.10000000.00000000 即149.88.128.0
廣播地址就是主機(jī)位全為1,即149.88.10111111.11111111即149.88.191.255

接著實(shí)現(xiàn)UDP廣播,我機(jī)子的IP為1.1.1.69,掩碼為255.255.255.0,因此廣播地址為1.1.1.255,服務(wù)端向廣播地址的8061端口發(fā)送數(shù)據(jù)報,客戶端綁定本機(jī)的8061端口,如下所示:

服務(wù)端:

const dgram = require('dgram');
const server = dgram.createSocket('udp4');

server.on('close',()=>{
  console.log('socket已關(guān)閉');
});

server.on('error',(err)=>{
  console.log(err);
});

server.on('listening',()=>{
  console.log('socket正在監(jiān)聽中...');
  server.setBroadcast(!0);//開啟廣播
  server.setTTL(128);
  server.send('大家好啊,我是服務(wù)端.',8061,'1.1.1.255');
});

server.on('message',(msg,rinfo)=>{
  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
});

server.bind('8060','1.1.1.69');

客戶端:

const dgram = require('dgram');
const client = dgram.createSocket('udp4');

client.on('close',()=>{
  console.log('socket已關(guān)閉');
});

client.on('error',(err)=>{
  console.log(err);
});
client.on('listening',()=>{
  console.log('socket正在監(jiān)聽中...');
});
client.on('message',(msg,rinfo)=>{
  console.log(`receive message from ${rinfo.address}:${rinfo.port}:${msg}`);
});
client.bind(8061,'1.1.1.69');

3、UDP組播實(shí)現(xiàn)

組播地址是實(shí)現(xiàn)UDP組播的關(guān)鍵,因此了解組播地址是重點(diǎn)。什么是組播地址?IANA將D類地址(224.0.0.0-239.255.255.255)分配給IP組播,用來標(biāo)識一個IP組播組,由IGMP(組管理協(xié)議)協(xié)議維護(hù)組成員關(guān)系,其中:

224.0.0.0~224.0.0.255為永久組地址,地址224.0.0.0保留不做分配,其它地址供路由協(xié)議使用;

224.0.1.0~224.0.1.255是公用組播地址,可以用于Internet;

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

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

向組播地址發(fā)送數(shù)據(jù)報,只有該組成員才會接收此數(shù)據(jù)報。

dgram模塊的addMembership()方法將socket加入組播組中,dropMembership()方法退出組播組。下面以組播地址224.100.100.100來實(shí)現(xiàn)UDP組播,如下所示:

服務(wù)端:

const dgram = require('dgram');
const server = dgram.createSocket('udp4');
const multicastAddr = '224.100.100.100';

server.on('close',()=>{
  console.log('socket已關(guān)閉');
});

server.on('error',(err)=>{
  console.log(err);
});

server.on('listening',()=>{
  console.log('socket正在監(jiān)聽中...');
  server.addMembership(multicastAddr);
  server.setMulticastTTL(128);
  setInterval(()=>{
    sendMsg();
  },1500);
});

server.on('message',(msg,rinfo)=>{
  console.log(`receive message from ${rinfo.address}:${rinfo.port}`);
});

function sendMsg(){
  server.send('大家好啊,我是服務(wù)端.',8061,multicastAddr);
}

server.bind('8060','1.1.1.69');

客戶端:

const dgram = require('dgram');
const client = dgram.createSocket('udp4');
const multicastAddr = '224.100.100.100';

client.on('close',()=>{
  console.log('socket已關(guān)閉');
});

client.on('error',(err)=>{
  console.log(err);
});
client.on('listening',()=>{
  console.log('socket正在監(jiān)聽中...');
  client.addMembership(multicastAddr);
});
client.on('message',(msg,rinfo)=>{
  console.log(`receive message from ${rinfo.address}:${rinfo.port}:${msg}`);
});
client.bind(8061,'1.1.1.69');

另外UDP內(nèi)網(wǎng)穿透相關(guān)的內(nèi)容,大家也可自行了解一下。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • nw.js實(shí)現(xiàn)類似微信的聊天軟件

    nw.js實(shí)現(xiàn)類似微信的聊天軟件

    本文給大家介紹的是使用nw.js實(shí)現(xiàn)類似微信的聊天軟件,還處于測試階段,功能非常少,大家一起來添磚加瓦吧。
    2015-03-03
  • NodeJS使用文件流解決大文件處理的內(nèi)存與時間效率問題

    NodeJS使用文件流解決大文件處理的內(nèi)存與時間效率問題

    在 NodeJS 中,文件操作是常見的任務(wù)之一,然而,當(dāng)處理大文件時,直接將整個文件加載到內(nèi)存中可能會導(dǎo)致內(nèi)存溢出或性能瓶頸,為了解決這一問題,NodeJS 提供了文件流(Stream)機(jī)制,本文將詳細(xì)介紹文件流的優(yōu)點(diǎn)、使用方法、應(yīng)用場景,并探討背壓(Backpressure)的概念
    2025-01-01
  • Express使用html模板的詳細(xì)代碼

    Express使用html模板的詳細(xì)代碼

    本篇文章主要介紹了Express使用html模板的詳細(xì)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • node.js文件上傳處理示例

    node.js文件上傳處理示例

    這篇文章主要介紹了node.js文件上傳處理的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下。
    2016-10-10
  • 充分發(fā)揮Node.js程序性能的一些方法介紹

    充分發(fā)揮Node.js程序性能的一些方法介紹

    這篇文章主要介紹了充分發(fā)揮Node.js程序性能的一些方法介紹,Node.js是把JavaScript用于服務(wù)器端的框架,需要的朋友可以參考下
    2015-06-06
  • Mac下安裝node.js及環(huán)境配置全過程

    Mac下安裝node.js及環(huán)境配置全過程

    這篇文章主要介紹了Mac下安裝node.js及環(huán)境配置全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • 淺談node node-sass sass-loader版本對應(yīng)問題

    淺談node node-sass sass-loader版本對應(yīng)問題

    本文主要介紹了淺談node node-sass sass-loader版本對應(yīng)問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • node+js搭建時間服務(wù)器的思路詳解

    node+js搭建時間服務(wù)器的思路詳解

    這篇文章主要介紹了node+js搭建時間服務(wù)器,通過本文的學(xué)習(xí)可以了解node的fs模塊怎么讀取數(shù)據(jù)及express怎么搭建服務(wù)器,設(shè)置數(shù)據(jù)接口的,需要的朋友可以參考下
    2022-07-07
  • node檢測端口可用性的實(shí)踐示例

    node檢測端口可用性的實(shí)踐示例

    本文主要介紹了node檢測端口可用性的實(shí)踐示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Node.js 的模塊知識匯總

    Node.js 的模塊知識匯總

    node.js中是通過模塊來劃分為單位來劃分所有功能的。每個模塊為一個js文件。每個模塊中定義的全局變量或函數(shù)的作用范圍也被限制在這個模塊中,只能用exports對象將其傳遞到外部。
    2017-08-08

最新評論

常熟市| 虎林市| 新源县| 巴东县| 阜阳市| 那曲县| 额尔古纳市| 麟游县| 山西省| 额尔古纳市| 阿瓦提县| 清丰县| 日喀则市| 哈尔滨市| 桂东县| 巴中市| 平江县| 衡南县| 商城县| 凭祥市| 聂拉木县| 元谋县| 皮山县| 双峰县| 丹阳市| 西藏| 饶平县| 武胜县| 满洲里市| 桑日县| 东平县| 南投县| 五指山市| 句容市| 穆棱市| 北流市| 翼城县| 水城县| 平谷区| 含山县| 文昌市|