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

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

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

1、什么是UDP?

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

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

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

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

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

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

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

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

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

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

3、dgram模塊API介紹

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

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

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

服務端:

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

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

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已關閉');
});

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廣播實現(xiàn)

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

IP:149.88.160.58
mask:11111111.11111111.11000000.00000000
IP&MASK得到網絡地址:149.88.128.0/18
網絡號就是主機位全為0,即149.88.10000000.00000000 即149.88.128.0
廣播地址就是主機位全為1,即149.88.10111111.11111111即149.88.191.255

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

服務端:

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

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

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

server.on('listening',()=>{
  console.log('socket正在監(jiān)聽中...');
  server.setBroadcast(!0);//開啟廣播
  server.setTTL(128);
  server.send('大家好啊,我是服務端.',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已關閉');
});

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組播實現(xiàn)

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

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為用戶可用的組播地址(臨時組地址),全網范圍內有效;

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

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

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

服務端:

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

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

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('大家好啊,我是服務端.',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已關閉');
});

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內網穿透相關的內容,大家也可自行了解一下。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • nodejs使用readline逐行讀取和寫入文件的實現(xiàn)

    nodejs使用readline逐行讀取和寫入文件的實現(xiàn)

    這篇文章給大家介紹了nodejs使用readline逐行讀取和寫入文件的實現(xiàn)方法,文中通過代碼示例給大家講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • node管理統(tǒng)計文件大小并顯示目錄磁盤空間狀態(tài)從零實現(xiàn)

    node管理統(tǒng)計文件大小并顯示目錄磁盤空間狀態(tài)從零實現(xiàn)

    這篇文章主要為大家介紹了node管理統(tǒng)計文件大小并顯示目錄磁盤空間狀態(tài)的從零實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-12-12
  • 詳解node Async/Await 更好的異步編程解決方案

    詳解node Async/Await 更好的異步編程解決方案

    這篇文章主要介紹了詳解Async/Await 更好的異步編程解決方案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • npm報錯"A?complete?log?of?this?run?can?be?found?in:"的解決辦法

    npm報錯"A?complete?log?of?this?run?can?be?found?

    這篇文章主要給大家介紹了關于npm報錯"A?complete?log?of?this?run?can?be?found?in:"的解決辦法,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-04-04
  • Node.js讀寫文件之批量替換圖片的實現(xiàn)方法

    Node.js讀寫文件之批量替換圖片的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狽ode.js讀寫文件之批量替換圖片的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-09-09
  • socket.io學習教程之基礎介紹(一)

    socket.io學習教程之基礎介紹(一)

    socket.io提供了基于事件的實時雙向通訊,所以下面這篇文章主要介紹了關于socket.io的相關資料,主要介紹了學習socket.io的基礎知識,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-04-04
  • node.js使用express框架進行文件上傳詳解

    node.js使用express框架進行文件上傳詳解

    在本篇內容里小編給大家整理了關于node.js使用express框架進行文件上傳的相關知識點內容,有需要的朋友們跟著學習下。
    2019-03-03
  • Node.js有效處理并發(fā)連接的過程

    Node.js有效處理并發(fā)連接的過程

    在現(xiàn)代 web 開發(fā)中,處理并發(fā)連接是一個對于構建高性能服務器至關重要的話題,Node.js 是一個使用 JavaScript 作為編程語言的服務器端環(huán)境,在這篇博客中,我們將深入探討 Node.js 如何有效地管理并發(fā)連接,并提供一些示例代碼以便于更好地理解這個過程
    2024-10-10
  • 淺談Node異步編程的機制

    淺談Node異步編程的機制

    本篇文章主要介紹了淺談Node異步編程的機制,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Node.js 在本地生成日志文件的方法

    Node.js 在本地生成日志文件的方法

    這篇文章主要介紹了Node.js 在本地生成日志文件的方法,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02

最新評論