Nodejs使用dgram模塊創(chuàng)建UDP服務詳解
引言
之前我們介紹了使用 Nodejs 的 net 模塊基于 Socket 創(chuàng)建 TCP 協(xié)議的服務,同時利用瀏覽器與我們創(chuàng)建的服務進行了連接,今天我們看一下怎么用 Nodejs 創(chuàng)建 UDP 服務。
UDP又稱用戶數(shù)據(jù)包協(xié)議,與TCP一樣同屬于網絡傳輸層。UDP與TCP最大的不同是UDP是無連接的。TCP中連接一旦建立,所有的會話都基于連接完成,客戶端如果要與另一個TCP服務通信,需要另創(chuàng)建一個套接字socket來完成連接。
在UDP中,它提供面向事務的簡單不可靠信息傳輸服務,在網絡差的情況下存在丟包嚴重的問題。但是由于它無須連接,資源消耗低,處理快速且靈活,所以常常應用在那種偶爾丟一兩個數(shù)據(jù)包也不會產生重大影響的場景:比如音視頻、流媒體服務等。目前DNS服務、HTTP/3都是基于它實現(xiàn)的。
創(chuàng)建一個 UDP 通信
創(chuàng)建 UDP 套接字
你可以通過 dgram 模塊提供的方法來創(chuàng)建UDP套接字:
const datagram = require("dgram");
const socket = datagram.createSocket("udp4");
?? UDP套接字一旦創(chuàng)建,既可以作為客戶端發(fā)送數(shù)據(jù),也可以作為服務器端接收數(shù)據(jù)。
綁定端口
若想讓UDP套接字接收網絡消息,只要調用 dgram.bind(port, [address]) 方法對網卡和端口進行綁定即可:
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后關閉此連接
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);
?? 該套接字將接收所有網卡上41234端口上的消息。在綁定完成后,將觸發(fā)listening事件。
創(chuàng)建服務端
現(xiàn)在讓我們創(chuàng)建一個服務端來與剛才的服務進行通信:
const dgram = require("dgram");
const client = dgram.createSocket("udp4");
// 創(chuàng)建 Buffer 流
const message = new Buffer.from("你好,upd服務端!");
client.send(message, 0, message.length, 41234, '127.0.0.1', (err, bytes) => {
client.close();
});
?? socket.send(buf, offset, length, port, address, [callback]) 可以將客戶端信息發(fā)送到目標地址。這些參數(shù)分別為要發(fā)送的Buffer、Buffer的偏移、Buffer的長度、目標端口、目標地址、發(fā)送完成后的回調。
與TCP套接字的write()相比,send()方法的參數(shù)列表相對復雜,但是它更靈活的地方在于可以隨意發(fā)送數(shù)據(jù)到網絡中的服務器端,而TCP如果要發(fā)送數(shù)據(jù)給另一個服務器端,則需要重新通過套接字構造新的連接。
最終運行效果:

UDP 套接字事件
UDP套接字相對TCP套接字使用起來更簡單,它只是一個 EventEmitter 的實例,而非 Stream 的實例。它具備如下自定義事件:
message:當UDP套接字偵聽網卡端口后,接收到消息時觸發(fā)該事件,觸發(fā)攜帶的數(shù)據(jù)為消息Buffer對象和一個遠程地址信息。listening:當UDP套接字開始偵聽時觸發(fā)該事件。close:調用close()方法時觸發(fā)該事件,并不再觸發(fā)message事件。error:當異常發(fā)生時觸發(fā)該事件,如果不偵聽,異常將直接拋出,使進程退出。
總結
TCP與UDP都屬于互聯(lián)網中傳輸層的協(xié)議,如果要構造高效的網絡應用,就應該從傳輸層進行著手。但是對于經典的應用場景,則無須從傳輸層協(xié)議入手構造自己的應用。比如HTTP、FTP等,這些經典的應用層協(xié)議對于普通應用而言綽綽有余。Node提供了基本的 http 和 https 模塊用于HTTP和HTTPS的封裝,而對于其他應用層協(xié)議的封裝,你可以在社區(qū)中找到其實現(xiàn)。
以上就是Nodejs使用dgram模塊創(chuàng)建UDP服務詳解的詳細內容,更多關于Nodejs dgram模塊創(chuàng)建UDP的資料請關注腳本之家其它相關文章!
相關文章
Node.js通過配置?strict-ssl=false解決npm安裝卡住問題
使用npm安裝依賴包是常見的任務之一,有時會遇到安裝卡住的問題,本文就來介紹一下通過配置?strict-ssl=false解決npm安裝卡住問題,感興趣的可以了解一下2024-12-12
使用Node.js find-up在父目錄中高效尋找文件與目錄
find-up 是一個小巧但功能強大的 Node.js 包,它能幫助我們實現(xiàn)這一需求,本文將深入探究如何使用 find-up 進行有效搜索,并結合豐富的代碼演示幫助大家快速掌握其用法,需要的朋友可以參考下2024-05-05
Node.js?搭建后端服務器內置模塊(?http+url+querystring?的使用)
這篇文章主要介紹了Node.js搭建后端服務器內置模塊(http+url+querystring的使用),文章圍繞主題展開詳細的內容戒殺,具有一定的參考價值,需要的朋友可以參考一下2022-09-09

