您好,登錄后才能下訂單哦!
本篇文章為大家展示了nodejs中怎么構建一個UDP服務,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
User Datagram Protocol,又稱用戶數據報協議
和TCP一樣,位于網絡傳輸層用于處理數據包
UDP 最大特點無連接
UDP 傳輸速度快
UDP 數據傳輸不可靠
不提供數據包分組,組裝和不能對數據包進行排序的缺點,也就是說,當報文發送之后,是無法得知其是否安全到達的
可靠性應由應用層負責
支持一對一通信,也支持一對多通信
許多關鍵的互聯網應用程序使用UDP
如DNS域名服務系統、TFTP簡單文件傳輸協議,DHCP動態主機設置協議等
UDP適用于對書讀要求比較高,對數據質量要求不嚴謹的應用
如流媒體,實時多人游戲,實時音視頻
| UDP | TCP ---|---|--- 連接| 無連接 | 面向連接 速度| 無需建立連接,速度較快 | 需要建立連接,速度較慢 目的主機 | 一對一,一對多 | 僅能一對一 帶寬 | UDP報頭較短,消耗帶寬更少 | 消耗更多的帶寬(報文較大) 消息邊界 | 有 | 無 可靠性 | 低 | 高 順序 | 無序 | 有序
事實上,UDP 協議的這種亂序性基本上很少出現,通常只會在網絡非常擁堵的情況下出現;
什么時候用TCP?什么時候用UDP ?
對速度要求比較高的時候用UDP, 例如視頻聊天,qq聊天
對數據安全性要求比較高的時候用TCP,例如數據傳輸,文件下載
假如對于視頻聊天來說,如果畫質優先就選用TCP,如果流暢度優先就選用UDP
UDP單播
單播的地址為單一目標的一種傳播方式
地址范圍:0.0.0.0 ~ 223.255.255.255
UDP廣播
受限廣播:它不會被路由轉發,IP地址網絡字段和主機字段全為1就是地址255.255.255.255
直接廣播:它會被路由轉發,IP地址的網絡字段定義這個網絡,主機字段通常為1,如:192.168.10.255
目的地址為網絡中的所有設備
地址范圍分兩種
UDP組播
多播也叫組播,把一組信息傳遞給一組目的地地址
單播一對多
單播通信中每一個數據包都有確切的IP地址
對于同一份數據,如果存在多個接收者,Server需發送與接受者數目相同的單播數據包
當接收者成百上千,將極大的家中Server的負擔
廣播面對一對多
廣播數據包被限制在局域網中
一旦有設備發送把廣播數據則廣播域內所有設備都收到這個數據包,并且不得不消耗資源去處理,大量的廣播數據包將消耗網絡的寬帶及設備資源
在IPv6中,廣播的傳輸方式被取消
組播面對一對多
組播非常適合一對多的模型,只有加入到特定的組播成員,才會接收到組播數據。當存在多個組播成員時,源無需發送多個數據拷貝,僅需發送一份即可,組播網絡設備會根據實際需要轉發或拷貝組播數據
數據流只發送給加入該組組播組的接受者(組成員),而不需要該數據的設備不會接收到該組播流量
相同的組播報文,在一段鏈路上僅有一份數據,大大提高了網絡資源的利用率
node的dgram模塊用于構建UDP服務
使用該模塊創建UDP套接字非常簡單,UDP套接字一旦創建,既可以作為客戶端發送數據,也可以作為服務器接收數據;
const dgram = require('dgram') const socket = dgram.createSocket('udp4')
API | 說明 |
---|---|
bind() | 綁定端口和主機 |
address() | 返回Socket地址對象 |
close() | 關閉Socket并停止監聽 |
send() | 發送消息 |
addMembership() | 添加組播成員 |
dropMembership() | 刪除組播成員 |
setBroadcast() | 設置是否啟用廣播 |
setTTL() | 設置數據報生存時間 |
setMulticastTTL() | 設置組播數據報生存時間 |
API | 說明 |
---|---|
listening | 監聽成功時觸發,僅觸發一次 |
message | 收到消息時觸發 |
error | 發生錯誤時觸發 |
close | 關閉socket時觸發 |
#####. 使用Node實現UDP單播 |
const dgram = require('dgram') const socket = dgram.createSocket('udp4') socket.on('listening', () =>{ console.log('連接成功') })
如果客戶端沒有綁定端口號,操作系統會自動分配一個端口號;如果指定了端口號,必須在socket的listening事件成功后才能send消息;
sever.js
const dgram = require('dgram'); const server = dgram.createSocket('udp4'); server.on('listening', r => { console.log('連接成功server:'); }); server.on('message', (msg, remoteAddress) => { console.log(`成功連接到${remoteAddress.address}:${remoteAddress.port}`); server.send('服務器說:小子我收到你的消息了', remoteAddress.port); }); server.on('close', () => { console.log('error'); }); server.bind(3000);
client.js
const dgram = require('dgram'); const client = dgram.createSocket('udp4'); client.on('listening', () => { const address = client.address(); console.log(`成功連接到${address.address}:${address.port}`); // 直接地址:192.168.10.255 把后三位改成255就可以 // 受限地址: 255.255.255.255 client.send('hello', 3000, 'localhost'); }); client.on('message', (msg, remoteAddress) => { console.log(`客戶端說收到服務器的消息了${msg}`); }); client.on('error', () => { console.log('server errord'); }); client.bind(3200);
// 在監聽成功后,開啟廣播模式 server.on('listening', () =>{ server.setBroadcast(true) })
server.js
// 只用在發送消息時,指定組播ip就可以了 server.on('listening', () => { server.send('發送組播消息', 3300, '224.0.1.100', (err) =>{ console.log(err) }) })
client.js
client.on('listening', () =>{ // 監聽成功后加入特定組播組的ip,此時客戶端就會收到組播數據 client.addMemberShip('224.0.1.100') } )
上述內容就是nodejs中怎么構建一個UDP服務,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。