1. 程式人生 > >node.js中通過dgram資料報模組建立UDP伺服器和客戶端

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('你好', 0, 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', function (msg, rinfo) {
    console.log(msg.toString());
});

client.on('error', function (err) {
    console.log(err);
});

//給8888埠的UDP傳送資料
client.send('你好', 0, 6, 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', function (msg, rinfo) {
    console.log(msg.toString());
    console.log(rinfo);
});

let buf = Buffer.from('廣播資料');
setInterval(function () {
    //向廣播IP傳送資料
    //注意客戶端監聽的埠要與這裡的埠一致,不然無法接收到廣播
    server.send(buf, 0, buf.length, 6666, '192.168.1.255', function (error, 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', function (msg, 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');
server.bind(8888, '192.168.1.102', function () {
    //設定資料包的生存時間
    server.setMulticastTTL(128);
    //將socket加入組播組中
    server.addMembership(multicastAddr);
    //開啟組播
    server.setMulticastLoopback(true);
});

server.on('message', function (msg, rinfo) {
    console.log(msg.toString());
});

let buf = Buffer.from('組播資料');
setInterval(function () {
    //向組播IP傳送資料
    //注意,客戶端監聽的埠要與這裡一致
    server.send(buf, 0, buf.length, 6666, multicastAddr, function (error, 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', function (msg, rinfo) {
    console.log(msg.toString());
});