nodejs-第一章-第二節-網絡通訊-構建UDP服務

內容索引:
  • UDP介紹
  • Node中的核心模塊dgram
  • 使用node實現UDP單播
  • 使用node實現UDP廣播
  • 使用node實現UDP組播
1.UDP簡介
  • User Datagram Protocol,又稱用戶數據報協議
  • 和TCP同樣,位於網絡傳輸層用於處理數據包
  • UDP 最大特色無鏈接
  • UDP 傳輸速度快
  • UDP 數據傳輸不可靠
    • 不提供數據包分組,組裝和不能對數據包進行排序的缺點,也就是說,當報文發送以後,是沒法得知其是否安全到達的
    • 可靠性應由應用層負責
  • 支持一對一通訊,也支持一對多通訊
  • 許多關鍵的互聯網應用程序使用UDP
    • 如DNS域名服務系統、TFTP簡單文件傳輸協議,DHCP動態主機設置協議等
  • UDP適用於對書讀要求比較高,對數據質量要求不嚴謹的應用
    • 如流媒體,實時多人遊戲,實時音視頻
1.1 TCP和UDP
  • | UDP | TCP ---|---|--- 鏈接| 無鏈接 | 面向鏈接 速度| 無需創建鏈接,速度較快 | 須要創建鏈接,速度較慢 目的主機 | 一對一,一對多 | 僅能一對一 帶寬 | UDP報頭較短,消耗帶寬更少 | 消耗更多的帶寬(報文較大) 消息邊界 | 有 | 無 可靠性 | 低 | 高 順序 | 無序 | 有序node

  • 事實上,UDP 協議的這種亂序性基本上不多出現,一般只會在網絡很是擁堵的狀況下出現;安全

何時用TCP?何時用UDP ?服務器

  • 對速度要求比較高的時候用UDP, 例如視頻聊天,qq聊天
  • 對數據安全性要求比較高的時候用TCP,例如數據傳輸,文件下載
  • 假如對於視頻聊天來講,若是畫質優先就選用TCP,若是流暢度優先就選用UDP
1.2 UDP的三種傳播方式
  1. UDP單播
    • 單播的地址爲單一目標的一種傳播方式
    • 地址範圍:0.0.0.0 ~ 223.255.255.255
  2. UDP廣播
    • 目的地址爲網絡中的全部設備
    • 地址範圍分兩種
      • 受限廣播:它不會被路由轉發,IP地址網絡字段和主機字段全爲1就是地址255.255.255.255
      • 直接廣播:它會被路由轉發,IP地址的網絡字段定義這個網絡,主機字段一般爲1,如:192.168.10.255
  3. UDP組播
    • 多播也叫組播,把一組信息傳遞給一組目的地地址
  • 單播一對多
    • 單播通訊中每個數據包都有確切的IP地址
    • 對於同一份數據,若是存在多個接收者,Server需發送與接受者數目相同的單播數據包
    • 當接收者成百上千,將極大的家中Server的負擔
  • 廣播面對一對多
    • 廣播數據包被限制在局域網中
    • 一旦有設備發送把廣播數據則廣播域內全部設備都收到這個數據包,而且不得不消耗資源去處理,大量的廣播數據包將消耗網絡的寬帶及設備資源
    • 在IPv6中,廣播的傳輸方式被取消
  • 組播面對一對多
    • 組播很是適合一對多的模型,只有加入到特定的組播成員,纔會接收到組播數據。當存在多個組播成員時,源無需發送多個數據拷貝,僅需發送一份便可,組播網絡設備會根據實際須要轉發或拷貝組播數據
    • 數據流只發送給加入該組組播組的接受者(組成員),而不須要該數據的設備不會接收到該組播流量
    • 相同的組播報文,在一段鏈路上僅有一份數據,大大提升了網絡資源的利用率

2. Node中的dgram模塊

  • node的dgram模塊用於構建UDP服務
  • 使用該模塊建立UDP套接字很是簡單,UDP套接字一旦建立,既能夠做爲客戶端發送數據,也能夠做爲服務器接收數據;
const dgram = require('dgram')
const socket = dgram.createSocket('udp4')
2.1 socket方法
API 說明
bind() 綁定端口和主機
address() 返回Socket地址對象
close() 關閉Socket並中止監聽
send() 發送消息
addMembership() 添加組播成員
dropMembership() 刪除組播成員
setBroadcast() 設置是否啓用廣播
setTTL() 設置數據報生存時間
setMulticastTTL() 設置組播數據報生存時間
2.2 Socket事件
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);
4.使用Node實現UDP廣播模式
// 在監聽成功後,開啓廣播模式
server.on('listening', () =>{
    server.setBroadcast(true) 
})
5. 使用Node實現UDP組播

server.jssocket

// 只用在發送消息時,指定組播ip就能夠了
server.on('listening', () => {
    server.send('發送組播消息', 3300, '224.0.1.100', (err) =>{
        console.log(err)
    })
})

client.jsui

client.on('listening', () =>{
    // 監聽成功後加入特定組播組的ip,此時客戶端就會收到組播數據
    client.addMemberShip('224.0.1.100')
} )
相關文章
相關標籤/搜索