這裡簡單介紹下,udp,即使用者資料報協議,一種面向無連線的傳輸層協議,提供不可靠的訊息傳送服務。udp協議使用埠號為不同的應用保留其各自的資料傳輸通道,這一點非常重要。與tcp相比,占用資源更少,傳輸速度更快。
向主機192.168.10.2的8060埠傳送資料報,該ip資料報目標ip在乙太網中被arp解析成mac位址,然後將此mac位址設定為目標位址發出去。
該子網下的主機乙太網介面看到該資料幀時,對比自己的mac位址,如果不一樣,則忽略該資料幀。
直到192.168.10.2主機看到該資料幀時,發現mac一致,則讀入該資料幀,然後在ip層對比目標ip和本機ip,在udp層對比埠號是否一致,最後接收該資料幀。
向192.168.10.255主機埠為8060傳送資料報,,該ip資料報目標ip在乙太網中被arp解析成mac位址,然後將此mac位址設定為目標位址發出去。
192.168.10.2和192.168.10.3的主機介面都會和此廣播位址匹配成功,直到該資料報進入傳輸層時根據埠是否匹配判斷是否丟棄該資料,埠為8060的會保留該資料,否則將資料丟棄。
該模組用來建立udp資料報socket,繼承了eventemitter,該模組的api如下所示:
服務端:
const dgram = require("dgram"),
server = dgram.createsocket("udp4");
server.on
("close", () => )
server.on
("error", (err) => )
server.on
("listening", () => )
server.on
("message", (msg, rinfo) => :$-$`);
server.send(`welcome $:$`, rinfo.port, rinfo.address);
settimeout(function () , 2000);
})server.bind
(8060)
客戶端:
const dgram = require("dgram"),
client = dgram.createsocket("udp4");
client.on
("close", () => )
client.on
("error", (err) => )
client.on
("listening", () => )
client.on
("message", (msg, rinfo) =>
console.log(`message from server $:$-$`);
})client.send
(`hello`,8060,'127.0.0.1');
要實現udp廣播,就必須知道廣播位址,廣播位址如何計算呢?可以利用ipconfig(windows)或ifconfig(*unix)得到ip位址和mask掩碼位址,然後利用ip位址與mask子網掩碼做與操作得到網路位址,網路位址中主機位都為1就是廣播位址,舉個例子:
接著實現udp廣播,我機子的ip為192.168.0.193,掩碼為255.255.255.0,因此廣播位址為192.168.0.255,服務端向廣播位址的8061埠傳送資料報,客戶端繫結本機的8061埠,如下所示:
服務端:
const dgram = require("dgram"),
server = dgram.createsocket("udp4");
server.on
("close", () => );
server.on
("listening", () => , 2000)
})server.on
("message", (msg, rinfo) => :$`);
})server.bind
(8060,"192.168.0.193");
客戶端:
const dgram = require("dgram"),
client = dgram.createsocket("udp4");
client.on
("close",()=>)
client.on
("error",err=>)
client.on
("listening",()=>)
client.on
("message",(msg,rinfo)=>`);
})client.bind
(8061,"192.168.0.193")
組播位址是實現udp組播的關鍵,因此了解組播位址是重點。什麼是組播位址?iana將d類位址
(224.0.0.0-239.255.255.255)分配給ip組播,用來標識乙個ip組播組,由igmp(組管理協議)協議維護組成員關係,其中:dgram模組的addmembership()方法將socket加入組播組中,dropmembership()方法退出組播組。下面以組播位址224.100.100.100來實現udp組播,如下所示:224.0.0.0~224.0.0.255為永久組位址,位址224.0.0.0保留不做分配,其它位址供路由協議使用;
224.0.1.0~224.0.1.255是公用組播位址,可以用於internet;
224.0.2.0~238.255.255.255為使用者可用的組播位址(臨時組位址),全網範圍內有效;
239.0.0.0~239.255.255.255為本地管理組播位址,僅在特定的本地範圍內有效。 向組播位址傳送資料報,只有該組成員才會接收此資料報。
服務端:
const dgram = require('dgram'),
server = dgram.createsocket("udp4"),
multicastaddr = '224.100.100.100';
server.on("error",err=>)
server.on
('error',(err)=>);
server.on
("listening",()=>,1500)
})server.on
('message',(msg,rinfo)=>:$`);
});function
sendmsg
()server.bind
(8060);
客戶端:
const dgram = require("dgram"),
client = dgram.createsocket("udp4"),
multicastaddr = '224.100.100.100';
client.on
("close", () => )
client.on
("error", err => )
client.on
("listening", () => )
client.on
("message", (msg, rinfo) => `);
})client.bind
(8061)
segmentfault【node dgram模組實現udp通訊】同步更 報表匯出模組實現
匯出的方法至少有三種,第一種是利用excel支援html,直接利用控制項的rendercontrol 方法,將控制項的html 以excel型別輸出到客戶端 第二種利用excel的com介面庫來完成 第三種利用資料訪問物件來操作excel檔案,以達到匯出excel的效果。以下是第一種的方法。輸出 p...
Python selenium模組實現定位過程解析
selenuim模組定位方法 1,我們想要操作html頁面上的元素,首先必須要定位到這個元素上。每個元素都有他各自的屬性,比如id,name,class等,我們就通過這些屬性來定位元素。2,我們先開啟乙個網頁,按f12來獲取這個網頁的源 方便我們定位元素。from selenium import w...
Redis Zset實現統計模組
檢視總體配置的數量以及活躍的數量 檢視每一條配置的使用量 直接在mysql中count即可得到 實現方式有很多,經過選擇之後,選取了用redis的zset來實現 使用hashmap,當獲取到配置的使用,那配置的key獲取value加1即可 可能存在的問題,併發問題,集群中每個節點的資料怎麼聚合 在m...