node.js基於dgram資料報模組建立UDP伺服器和客戶端操作示例
阿新 • • 發佈:2020-02-14
本文例項講述了node.js基於dgram資料報模組建立UDP伺服器和客戶端操作。分享給大家供大家參考,具體如下:
node.js中 dgram 模組提供了udp資料包的socket實現,可以方便的建立udp伺服器和客戶端。
一、建立UDP伺服器和客戶端
服務端:
const dgram = require('dgram'); //建立upd套接字 //引數一表示套接字型別,'udp4' 或 'udp6' //引數二表示事件監聽函式,'message' 事件監聽器 let server = dgram.createSocket('udp4'); //繫結埠和主機地址 server.bind(8888,'127.0.0.1'); //有新資料包被接收時,觸發 server.on('message',function (msg,rinfo) { //msg表示接收到的資料 //rinfo表示遠端主機的地址資訊 console.log('接收到的資料 : ',msg.toString()); console.log(rinfo); //傳送資料,如果傳送資料之前沒有繫結過地址和埠,則會隨機分配埠。 //引數一表示,要傳送的資料 string或buffer //引數二表示,傳送資料的偏移量 //引數三表示,傳送資料的位元組數 //引數四表示,目標埠 //引數五表示,目標主機名或IP地址 //引數六表示,訊息傳送完畢後的回撥函式 server.send('你好',6,rinfo.port,rinfo.address); }); //開始監聽資料包時,觸發 server.on('listening',function () { console.log('監聽開始'); }); //使用 close() 關閉socket之後觸發 server.on('close',function () { console.log('關閉'); }); //發生錯誤時觸發 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',rinfo) { console.log(msg.toString()); }); client.on('error',function (err) { console.log(err); }); //給8888埠的UDP傳送資料 client.send('你好',8888,'127.0.0.1',function (error,bytes) { if (error) { console.log(error); } console.log(`傳送了 ${bytes} 個位元組資料`); });
udp中伺服器與客戶端並沒有嚴格的劃分,既可以作為伺服器接收資料處理資料,也可以像客戶端一樣請求資料,彼此之間相對獨立。
二、通過UDP伺服器進行廣播
我們知道一個IP地址是由網路地址和主機地址組成的,而廣播IP的主機位全為1,當我們向一個廣播IP傳送資料時,則該資料將分發給所有同網段的主機。
服務端:
const dgram = require('dgram'); let server = dgram.createSocket('udp4'); //注意setBroadcast()必須在繫結socket成功後才能呼叫 server.bind(8888,'192.168.1.102',function () { //啟用廣播 server.setBroadcast(true); server.setTTL(128); }); server.on('message',rinfo) { console.log(msg.toString()); console.log(rinfo); }); let buf = Buffer.from('廣播資料'); setInterval(function () { //向廣播IP傳送資料 //注意客戶端監聽的埠要與這裡的埠一致,不然無法接收到廣播 server.send(buf,buf.length,6666,'192.168.1.255',bytes) { if (error) { console.log(error); } console.log(`傳送 ${bytes} 個位元組資料`); }); },3000);
客戶端:
const dgram = require('dgram'); let client = dgram.createSocket('udp4'); //如果監聽不到廣播資料,設定成 0.0.0.0 看看 client.bind(6666,'192.168.1.111'); client.on('message',rinfo) { console.log(msg.toString()); });
三、通過UDP進行組播
組播就是將網路中的主機進行邏輯上的分組,向一個組播地址傳送資料,該組下的所有主機都會收到資料。
實現組播,並不是直接把資料傳送給目標地址,而是將資料傳送給組播主機,然後分發給組內的所有成員。
在網路中,使用D類地址作為組播地址,範圍是 224.0.0.0 - 239.255.255.255。
分為四類:
1、224.0.0.0 ~ 224.0.0.255 地址224.0.0.0保留不做分配,其它供路由協議使用。
2、224.0.1.0 ~ 224.0.1.255 公用組播地址,可以用於Internet。
3、224.0.2.0 ~ 238.255.255.255 為使用者可用的組播地址(臨時組地址),全網範圍內有效。
4、239.0.0.0 ~ 239.255.255.255 為本地管理組播地址,僅在特定的本地範圍內有效。
通過 addMembership() 將 socket 加入組播中,dropMembership() 方法退出組播。
服務端:
const dgram = require('dgram'); //組播地址 const multicastAddr = '224.1.1.1'; let server = dgram.createSocket('udp4'); //注意setMulticastLoopback()要在繫結成功後設置 server.bind(8888,function () { //設定資料包的生存時間 server.setMulticastTTL(128); //將socket加入組播組中 server.addMembership(multicastAddr); //開啟組播 server.setMulticastLoopback(true); }); server.on('message',rinfo) { console.log(msg.toString()); }); let buf = Buffer.from('組播資料'); setInterval(function () { //向組播IP傳送資料 //注意,客戶端監聽的埠要與這裡一致 server.send(buf,multicastAddr,bytes) { console.log(`傳送 ${bytes} 位元組資料`); }); },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',rinfo) { console.log(msg.toString()); });
希望本文所述對大家node.js程式設計有所幫助。