摘要:組播向一個組播地址發送數據報,該組網絡下的所有主機都會受到影響,主機根據端口號來判斷是否丟棄該數據。向組播地址發送數據報,只有該組成員才會接收此數據報。模塊的方法將加入組播組中,方法退出組播組。模塊實現通信同步更新
1、什么是UDP?
這里簡單介紹下,UDP,即用戶數據報協議,一種面向無連接的傳輸層協議,提供不可靠的消息傳送服務。UDP協議使用端口號為不同的應用保留其各自的數據傳輸通道,這一點非常重要。與TCP相比,占用資源更少,傳輸速度更快。
2、了解UDP單播、廣播和組播單播:向一個單播地址發送UDP數據報時,數據報只能被指定的IP主機接收,同一子網下的其它主機都不會接收該數據報。單播過程(假設子網地址:192.168.10,該子網下有兩臺主機:192.168.10.2,192.168.10.3,向192.168.10.2發送數據報)
向主機192.168.10.2的8060端口發送數據報,該IP數據報目標IP在以太網中被ARP解析成MAC地址,然后將此MAC地址設置為目標地址發出去。
該子網下的主機以太網接口看到該數據幀時,對比自己的MAC地址,如果不一樣,則忽略該數據幀。
直到192.168.10.2主機看到該數據幀時,發現MAC一致,則讀入該數據幀,然后在IP層對比目標IP和本機IP,在UDP層對比端口號是否一致,最后接收該數據幀。
廣播:向一個廣播地址發送UDP數據報,該廣播網絡下的所有主機都會受到影響,主機根據端口號來判斷是否丟棄該數據。廣播過程(假設子網地址:192.168.10,則該網絡的廣播地址為:192.168.10.255,該子網下有兩臺主機:192.168.10.2,192.168.10.3,向192.168.10.255發送數據報):
向192.168.10.255主機端口為8060發送數據報,,該IP數據報目標IP在以太網中被ARP解析成MAC地址,然后將此MAC地址設置為目標地址發出去。
192.168.10.2和192.168.10.3的主機接口都會和此廣播地址匹配成功,直到該數據報進入傳輸層時根據端口是否匹配判斷是否丟棄該數據,端口為8060的會保留該數據,否則將數據丟棄。
組播:向一個組播地址發送UDP數據報,該組網絡下的所有主機都會受到影響,主機根據端口號來判斷是否丟棄該數據。組播過程原理與廣播類似。
3.dgram 模塊API介紹該模塊用來創建UDP數據報socket,繼承了EventEmitter,該模塊的API如下所示:
3.1 UDP單播實現服務端:
const dgram = require("dgram"), server = dgram.createSocket("udp4"); server.on("close", () => { console.log("socket已經關閉"); }) server.on("error", (err) => { console.log(err); }) server.on("listening", () => { console.log("socket正在監聽..."); }) server.on("message", (msg, rinfo) => { console.log(`message from client ${rinfo.address}:${rinfo.port}-${msg}`); server.send(`welcome ${rinfo.address}:${rinfo.port}`, rinfo.port, rinfo.address); setTimeout(function () { server.send(`exit`, rinfo.port, rinfo.address); }, 2000); }) server.bind(8060)
客戶端:
const dgram = require("dgram"), client = dgram.createSocket("udp4"); client.on("close", () => { console.log("socket已經關閉"); }) client.on("error", (err) => { console.log(err); }) client.on("listening", () => { console.log("socket正在監聽"); }) client.on("message", (msg, rinfo) => { if (msg == "exit") { client.close(); } console.log(`message from server ${rinfo.address}:${rinfo.port}-${msg}`); }) client.send(`hello`,8060,"127.0.0.1");3.2 UDP廣播實現
要實現UDP廣播,就必須知道廣播地址,廣播地址如何計算呢?可以利用ipconfig(windows)或ifconfig(*unix)得到ip地址和mask掩碼地址,然后利用ip地址與mask子網掩碼做與操作得到網絡地址,網絡地址中主機位都為1就是廣播地址,舉個例子:
IP:149.88.160.58 mask:11111111.11111111.11000000.00000000
IP&MASK得到網絡地址:149.88.128.0/18 網絡號就是主機位全為0,即149.88.10000000.00000000
即149.88.128.0 廣播地址就是主機位全為1,即149.88.10111111.11111111即149.88.191.255
接著實現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", () => { console.log("socket已關閉...."); }); server.on("listening", () => { console.log("socket正在監聽..."); server.setBroadcast(true); server.setTTL(128); setInterval(() => { server.send("大家好啊,我是服務端.", 8061, "192.168.0.255") }, 2000) }) server.on("message", (msg, rinfo) => { console.log(`msg from client ${rinfo.address}:${rinfo.port}`); }) server.bind(8060,"192.168.0.193");
客戶端:
const dgram = require("dgram"), client = dgram.createSocket("udp4"); client.on("close",()=>{ console.log("socket已關閉..."); }) client.on("error",err=>{ console.log(err); }) client.on("listening",()=>{ console.log("正在監聽..."); }) client.on("message",(msg,rinfo)=>{ console.log(`msg from server:${msg}`); }) client.bind(8061,"192.168.0.193")3.3 UDP組播實現
組播地址是實現UDP組播的關鍵,因此了解組播地址是重點。什么是組播地址?IANA將D類地址
(224.0.0.0-239.255.255.255)分配給IP組播,用來標識一個IP組播組,由IGMP(組管理協議)協議維護組成員關系,其中:
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為本地管理組播地址,僅在特定的本地范圍內有效。 向組播地址發送數據報,只有該組成員才會接收此數據報。
dgram模塊的addMembership()方法將socket加入組播組中,dropMembership()方法退出組播組。下面以組播地址224.100.100.100來實現UDP組播,如下所示:
服務端:
const dgram = require("dgram"), server = dgram.createSocket("udp4"), multicastAddr = "224.100.100.100"; server.on("error",err=>{ console.log("socket已關閉"); }) server.on("error",(err)=>{ console.log(err); }); server.on("listening",()=>{ console.log("socket正在監聽中....."); server.addMembership(multicastAddr); server.setMulticastTTL(128); setInterval(()=>{ sendMsg(); },1500) }) server.on("message",(msg,rinfo)=>{ console.log(`msg from client ${rinfo.address}:${rinfo.port}`); }); function sendMsg(){ server.send("大家好啊,我是服務端.",8061,multicastAddr); } server.bind(8060);
客戶端:
const dgram = require("dgram"), client = dgram.createSocket("udp4"), multicastAddr = "224.100.100.100"; client.on("close", () => { console.log("socket已關閉..."); }) client.on("error", err => { console.log(err); }) client.on("listening", () => { console.log("socket正在監聽..."); client.addMembership(multicastAddr); }) client.on("message", (msg, rinfo) => { console.log(`msg from server:${msg}`); }) client.bind(8061)
另外UDP內網穿透相關的內容,大家也可自行了解一下。
CSDN【Node dgram模塊實現UDP通信】同步更新
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/88705.html
摘要:在任何類型的通信開始之前,網絡應用程序必須創建套接字。基于文件的套接字,家族名又名基于網絡的套接字,家族名在和后續的版本中,支持的套接字有,,,。中的網絡編程在中主要是用模塊來實現基于套接字的網絡通信。 python學習記錄--網絡編程 1、套接字介紹 一臺機器上的不同進程之間進行通信可以利用隊列,管道等,但是不同機器之間的進程進行通信用隊列是不行的,解決這個問題就是網絡套接字。 套接...
摘要:進程間通信的目的是為了讓不同的進程能夠互相訪問資源,并進程協調工作。這個過程的示意圖如下端口共同監聽集群穩定之路進程事件自動重啟負載均衡狀態共享模塊工作原理事件二測試單元測試性能測試三產品化項目工程化部署流程性能日志監控報警穩定性異構共存 內容 9.玩轉進程10.測試11.產品化 一、玩轉進程 node的單線程只不過是js層面的單線程,是基于V8引擎的單線程,因為,V8的緣故,前后...
摘要:是建立可靠連接,并且通信雙方都可以以流的形式發送數據。相對,則是面向無連接的協議。測試結果用兩個命令行分別啟動服務器和客戶端測試開啟服務端完成一次通信 UDP TCP是建立可靠連接, 并且通信雙方都可以以流的形式發送數據。 相對TCP, UDP則是面向無連接的協議。使用UDP協議時, 不需要建立連接, 只需要知道對方的IP地址和端口號, 就可以直接發數據包。 但是, 能不能到達就不知道...
摘要:子進程使用反序列化消息字符串為消息對象。在調用這類方法時,遍歷列表中的實例發送內部消息,子進程列表中的對應項收到內部消息并處理返回,父進程中再結合返回結果和對應著這個類實例維護的信息,保證功能的正確性。 在 Node.js 中,當我們使用 child_process 模塊創建子進程后,會返回一個 ChildProcess 類的實例,通過調用 ChildProcess#send(mess...
摘要:創建創建通信接受套接字的數據,與類似,但返回值是。發送數據,將數據發送到,形式為,指定遠程地址發送,返回值是發送的字節數發送的報文是類型,發送的報文是類型,在發送前要記得編碼。 UDP 和 TCP 的區別 ? TCP UDP 連接性 面向連接 面向無連接 傳輸可靠性 可靠 不可靠 傳輸模式 流 數據報 應用場景 傳輸大量的數據 少量數據 速度 慢 快 T...
閱讀 3110·2021-11-10 11:36
閱讀 3312·2021-10-13 09:40
閱讀 6051·2021-09-26 09:46
閱讀 662·2019-08-30 15:55
閱讀 1409·2019-08-30 15:53
閱讀 1580·2019-08-29 13:55
閱讀 2997·2019-08-29 12:46
閱讀 3204·2019-08-29 12:34