新聞中心
小編給大家分享一下node.js基于dgram數(shù)據(jù)報(bào)模塊如何創(chuàng)建UDP服務(wù)器和客戶端,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
創(chuàng)新互聯(lián)是網(wǎng)站建設(shè)專家,致力于互聯(lián)網(wǎng)品牌建設(shè)與網(wǎng)絡(luò)營銷,專業(yè)領(lǐng)域包括網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)、電商網(wǎng)站制作開發(fā)、小程序制作、微信營銷、系統(tǒng)平臺(tái)開發(fā),與其他網(wǎng)站設(shè)計(jì)及系統(tǒng)開發(fā)公司不同,我們的整合解決方案結(jié)合了恒基網(wǎng)絡(luò)品牌建設(shè)經(jīng)驗(yàn)和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結(jié)合,且不斷評(píng)估并優(yōu)化我們的方案,為客戶提供全方位的互聯(lián)網(wǎng)品牌整合方案!
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基于dgram數(shù)據(jù)報(bào)模塊如何創(chuàng)建UDP服務(wù)器和客戶端”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)頁題目:node.js基于dgram數(shù)據(jù)報(bào)模塊如何創(chuàng)建UDP服務(wù)器和客戶端
網(wǎng)頁路徑:http://fisionsoft.com.cn/article/iicdji.html