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

Nodejs使用dgram模塊創(chuàng)建UDP服務(wù)詳解

 更新時(shí)間:2022年10月18日 15:54:41   作者:SaraiNoQ  
這篇文章主要為大家介紹了Nodejs使用dgram模塊創(chuàng)建UDP服務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

引言

之前我們介紹了使用 Nodejs 的 net 模塊基于 Socket 創(chuàng)建 TCP 協(xié)議的服務(wù),同時(shí)利用瀏覽器與我們創(chuàng)建的服務(wù)進(jìn)行了連接,今天我們看一下怎么用 Nodejs 創(chuàng)建 UDP 服務(wù)。

UDP又稱用戶數(shù)據(jù)包協(xié)議,與TCP一樣同屬于網(wǎng)絡(luò)傳輸層。UDP與TCP最大的不同是UDP是無(wú)連接的。TCP中連接一旦建立,所有的會(huì)話都基于連接完成,客戶端如果要與另一個(gè)TCP服務(wù)通信,需要另創(chuàng)建一個(gè)套接字socket來(lái)完成連接。

在UDP中,它提供面向事務(wù)的簡(jiǎn)單不可靠信息傳輸服務(wù),在網(wǎng)絡(luò)差的情況下存在丟包嚴(yán)重的問(wèn)題。但是由于它無(wú)須連接,資源消耗低,處理快速且靈活,所以常常應(yīng)用在那種偶爾丟一兩個(gè)數(shù)據(jù)包也不會(huì)產(chǎn)生重大影響的場(chǎng)景:比如音視頻、流媒體服務(wù)等。目前DNS服務(wù)、HTTP/3都是基于它實(shí)現(xiàn)的。

創(chuàng)建一個(gè) UDP 通信

創(chuàng)建 UDP 套接字

你可以通過(guò) dgram 模塊提供的方法來(lái)創(chuàng)建UDP套接字:

const datagram = require("dgram");
const socket = datagram.createSocket("udp4");

?? UDP套接字一旦創(chuàng)建,既可以作為客戶端發(fā)送數(shù)據(jù),也可以作為服務(wù)器端接收數(shù)據(jù)。

綁定端口

若想讓UDP套接字接收網(wǎng)絡(luò)消息,只要調(diào)用 dgram.bind(port, [address]) 方法對(duì)網(wǎng)卡和端口進(jìn)行綁定即可:

const datagram = require("dgram");
const socket = datagram.createSocket("udp4");
socket.on('message', (msg, rinfo) => {
    console.log(`server got message: ${msg} from ${rinfo.address}:${rinfo.port}`);
    // 3s后關(guān)閉此連接
    setTimeout(() => {
        socket.close();
    }, 3000)
});
socket.on('listening', () => {
    const address = socket.address();
    console.log("server listening:", address.address + ":" + address.port);
});
socket.on('close', () => {
    console.log('closed server!');
})
socket.bind(41234);

?? 該套接字將接收所有網(wǎng)卡上41234端口上的消息。在綁定完成后,將觸發(fā)listening事件。

創(chuàng)建服務(wù)端

現(xiàn)在讓我們創(chuàng)建一個(gè)服務(wù)端來(lái)與剛才的服務(wù)進(jìn)行通信:

const dgram = require("dgram");
const client = dgram.createSocket("udp4");
// 創(chuàng)建 Buffer 流
const message = new Buffer.from("你好,upd服務(wù)端!");
client.send(message, 0, message.length, 41234, '127.0.0.1', (err, bytes) => {
    client.close();
});

?? socket.send(buf, offset, length, port, address, [callback]) 可以將客戶端信息發(fā)送到目標(biāo)地址。這些參數(shù)分別為要發(fā)送的Buffer、Buffer的偏移、Buffer的長(zhǎng)度、目標(biāo)端口、目標(biāo)地址、發(fā)送完成后的回調(diào)。

與TCP套接字的write()相比,send()方法的參數(shù)列表相對(duì)復(fù)雜,但是它更靈活的地方在于可以隨意發(fā)送數(shù)據(jù)到網(wǎng)絡(luò)中的服務(wù)器端,而TCP如果要發(fā)送數(shù)據(jù)給另一個(gè)服務(wù)器端,則需要重新通過(guò)套接字構(gòu)造新的連接。

最終運(yùn)行效果:

UDP 套接字事件

UDP套接字相對(duì)TCP套接字使用起來(lái)更簡(jiǎn)單,它只是一個(gè) EventEmitter 的實(shí)例,而非 Stream 的實(shí)例。它具備如下自定義事件:

  • message:當(dāng)UDP套接字偵聽(tīng)網(wǎng)卡端口后,接收到消息時(shí)觸發(fā)該事件,觸發(fā)攜帶的數(shù)據(jù)為消息Buffer對(duì)象和一個(gè)遠(yuǎn)程地址信息。
  • listening:當(dāng)UDP套接字開(kāi)始偵聽(tīng)時(shí)觸發(fā)該事件。
  • close:調(diào)用close()方法時(shí)觸發(fā)該事件,并不再觸發(fā)message事件。
  • error:當(dāng)異常發(fā)生時(shí)觸發(fā)該事件,如果不偵聽(tīng),異常將直接拋出,使進(jìn)程退出。

總結(jié)

TCP與UDP都屬于互聯(lián)網(wǎng)中傳輸層的協(xié)議,如果要構(gòu)造高效的網(wǎng)絡(luò)應(yīng)用,就應(yīng)該從傳輸層進(jìn)行著手。但是對(duì)于經(jīng)典的應(yīng)用場(chǎng)景,則無(wú)須從傳輸層協(xié)議入手構(gòu)造自己的應(yīng)用。比如HTTP、FTP等,這些經(jīng)典的應(yīng)用層協(xié)議對(duì)于普通應(yīng)用而言綽綽有余。Node提供了基本的 httphttps 模塊用于HTTP和HTTPS的封裝,而對(duì)于其他應(yīng)用層協(xié)議的封裝,你可以在社區(qū)中找到其實(shí)現(xiàn)。

以上就是Nodejs使用dgram模塊創(chuàng)建UDP服務(wù)詳解的詳細(xì)內(nèi)容,更多關(guān)于Nodejs dgram模塊創(chuàng)建UDP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問(wèn)題詳解

    node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問(wèn)題詳解

    這篇文章主要給大家介紹了關(guān)于node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)把。
    2017-10-10
  • node.js的Express服務(wù)器基本使用教程

    node.js的Express服務(wù)器基本使用教程

    express是一個(gè)開(kāi)源的node.js項(xiàng)目框架,下面這篇文章主要給大家介紹了關(guān)于node.js的Express服務(wù)器基本使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • node?puppeteer爬蟲(chóng)爬取電影網(wǎng)站及生成pdf文檔示例

    node?puppeteer爬蟲(chóng)爬取電影網(wǎng)站及生成pdf文檔示例

    這篇文章主要介紹了node?puppeteer爬蟲(chóng)爬取電影網(wǎng)站及生成pdf文檔使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳

    nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳

    這篇文章主要介紹了nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳,需要的朋友可以參考下
    2015-02-02
  • Nodejs + sequelize 實(shí)現(xiàn)增刪改查操作

    Nodejs + sequelize 實(shí)現(xiàn)增刪改查操作

    這篇文章主要介紹了Nodejs + sequelize 實(shí)現(xiàn)增刪改查操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • Nodejs中koa2連接mysql的實(shí)現(xiàn)示例

    Nodejs中koa2連接mysql的實(shí)現(xiàn)示例

    本文主要介紹了Nodejs中koa2連接mysql的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • NodeJS學(xué)習(xí)筆記之MongoDB模塊

    NodeJS學(xué)習(xí)筆記之MongoDB模塊

    nodejs是個(gè)強(qiáng)大的平臺(tái),有基本功能,而且可以掛很多模塊。我們現(xiàn)在需要和mongodb連接的驅(qū)動(dòng),就類似比如mysql的java驅(qū)動(dòng)一樣。nodejs有好幾個(gè)mongodb的第三方驅(qū)動(dòng)。和jdbc不一樣,沒(méi)有標(biāo)準(zhǔn)。所以需要到驅(qū)動(dòng)的網(wǎng)站上去了解學(xué)習(xí)怎么使用它訪問(wèn)mongodb。
    2015-01-01
  • 利用Node轉(zhuǎn)換Excel成JSON的詳細(xì)步驟

    利用Node轉(zhuǎn)換Excel成JSON的詳細(xì)步驟

    最近工作中遇到一個(gè)需求,大致需求就是將Excel文件在導(dǎo)入時(shí)解析為json格式轉(zhuǎn)換數(shù)據(jù)結(jié)構(gòu)再傳輸給后臺(tái),下面這篇文章主要給大家介紹了關(guān)于如何利用Node轉(zhuǎn)換Excel成JSON的詳細(xì)步驟,需要的朋友可以參考下
    2022-11-11
  • Node.js使用MySQL連接池的方法實(shí)例

    Node.js使用MySQL連接池的方法實(shí)例

    這篇文章主要介紹了Node.js使用MySQL連接池的方法,結(jié)合具體實(shí)例形式分析了nodejs操作mysql連接池的相關(guān)模塊安裝、連接、查詢等使用技巧,需要的朋友可以參考下
    2018-02-02
  • node.js中的console.error方法使用說(shuō)明

    node.js中的console.error方法使用說(shuō)明

    這篇文章主要介紹了node.js中的console.error方法使用說(shuō)明,本文介紹了console.error的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12

最新評(píng)論