国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

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

2019-11-19 15:17:59
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

1、什么是UDP?

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

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

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

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

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

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

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

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

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

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

3、dgram模塊API介紹

該模塊用來(lái)創(chuàng)建UDP數(shù)據(jù)報(bào)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就是廣播地址,舉個(gè)例子:

IP:149.88.160.58
mask:11111111.11111111.11000000.00000000
IP&MASK得到網(wǎng)絡(luò)地址:149.88.128.0/18
網(wǎng)絡(luò)號(hào)就是主機(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ù)報(bào),客戶端綁定本機(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組播,用來(lái)標(biāo)識(shí)一個(gè)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為用戶可用的組播地址(臨時(shí)組地址),全網(wǎng)范圍內(nèi)有效;

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

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

dgram模塊的addMembership()方法將socket加入組播組中,dropMembership()方法退出組播組。下面以組播地址224.100.100.100來(lái)實(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)容,大家也可自行了解一下。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持武林網(wǎng)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 天长市| 彰化县| 乌海市| 灵宝市| 黑河市| 广汉市| 平凉市| 泽库县| 郧西县| 黄骅市| 安庆市| 肇庆市| 贵溪市| 玉林市| 房山区| 仁布县| 嘉禾县| 大石桥市| 平潭县| 林甸县| 清水县| 茂名市| 太白县| 青铜峡市| 海安县| 揭阳市| 府谷县| 库伦旗| 临漳县| 图们市| 丽水市| 肇州县| 紫阳县| 邵武市| 庆云县| 罗城| 镇江市| 洮南市| 香河县| 深水埗区| 依兰县|