java 單播、組播、廣播

單播」(Unicast)、「多播」(Multicast)和「廣播」(Broadcast)這三個術語都是用來描述網絡節點之間通信方式的術語。那麼這些術語到底是什麼意思?區別何在?

1. 單播:網絡節點之間的通訊就好像是人們之間的對話同樣。若是一我的對另一我的說話,那麼用網絡技術的術語來描述就是「單播」,此時信息的接收和傳遞只在兩個節點之間進行。單播在網絡中獲得了普遍的應用,網絡上絕大部分的數據都是以單播的形式傳輸的,只是通常網絡用戶不知道而已。例如,你在收發電子郵件、瀏覽網頁時,必須與郵件服務器、Web服務器創建鏈接,此時使用的就是單播數據傳輸方式。可是一般使用「點對點通訊」(Point to Point)代替「單播」,由於「單播」通常與「多播」和「廣播」相對應使用。

2.多播:「多播」也能夠稱爲「組播」,在網絡技術的應用並非不少,網上視頻會議、網上視頻點播特別適合採用多播方式。由於若是採用單播方式,逐個節點傳輸,有多少個目標節點,就會有多少次傳送過程,這種方式顯然效率極低,是不可取的;若是採用不區分目標、所有發送的廣播方式,雖然一次能夠傳送完數據,可是顯然達不到區分特定數據接收對象的目的。採用多播方式,既能夠實現一次傳送全部目標節點的數據,也能夠達到只對特定對象傳送數據的目的。IP網絡的多播通常經過多播IP地址來實現。多播IP地址就是D類IP地址,即224.0.0.0至239.255.255.255之間的IP地址。 Windows 2000中的DHCP管理器支持多播IP地址的自動分配。

3.廣播:「廣播」在網絡中的應用較多,如客戶機經過 DHCP自動得到IP地址的過程就是經過廣播來實現的。可是同單播和多播相比,廣播幾乎佔用了子網內網絡的全部帶寬。拿開會打一個比方吧,在會場上只能有一我的發言,想象一下若是全部的人同時都用麥克風發言,那會場上就會亂成一鍋粥。集線器因爲其工做原理決定了不可能過濾廣播風暴,通常的交換機也沒有這一功能,不過如今有的網絡交換機(如全向的QS系列交換機)也有過濾廣播風暴功能了,路由器自己就有隔離廣播風暴的做用。廣播風暴不能徹底杜絕,可是隻能在同一子網內傳播,就好像喇叭的聲音只能在同一會場內傳播同樣,所以在由幾百臺甚至上千臺電腦構成的大中型局域網中,通常進行子網劃分,就像將一個大廳用牆壁隔離成許多小廳同樣,以達到隔離廣播風暴的目的。在IP網絡中,廣播地址用IP地址「255.255.255.255」來表示,這個IP地址表明同一子網內全部的IP地址。java

 

多播示例代碼  收藏代碼服務器

  1. package com.goma.test;  網絡

  2.   

  3. import java.net.DatagramPacket;  spa

  4. import java.net.InetAddress;  .net

  5. import java.net.MulticastSocket;  orm

  6.   

  7. public class MultiCastSend {  視頻

  8.     public static void main(String[]args){  對象

  9.         try {  生命週期

  10.             /******************發送組播數據****************/  ip

  11.             //指定組播IP  

  12.             InetAddress ip = InetAddress.getByName("228.5.6.7");  

  13.           

  14.             MulticastSocket s = new MulticastSocket();  

  15.             //加入該組   

  16.             s.joinGroup(ip);  

  17.               

  18.             //在多播中設置了TTl值(Time to live),每個ip數據報文中都包含一個TTL,  

  19.             //每當有路由器轉發該報文時,TTL減1,知道減爲0時,生命週期結束,報文即時沒有到達目的地,  

  20.             //也當即宣佈死亡。固然在Java中,ttl並非十分準確的,  

  21.             //曾經在一本書中介紹過報文的傳播距離是不會超過ttl所設置的值的。  

  22.             s.setTimeToLive(1);  

  23.               

  24.             String msg = "IP:123123123;PORT:1231";  

  25.             DatagramPacket hi = new DatagramPacket(msg.getBytes(), msg.length(),ip, 6789);  

  26.             s.send(hi);  

  27.             /******************發送組播數據****************/  

  28.             s.close();  

  29.               

  30.         } catch (Exception e) {  

  31.             // TODO Auto-generated catch block  

  32.             e.printStackTrace();  

  33.         }  

  34.     }  

  35.   

  36. }  

  37.   

  38.   

  39.   

  40.   

  41.   

  42. package com.goma.test;  

  43.   

  44. import java.net.DatagramPacket;  

  45. import java.net.InetAddress;  

  46. import java.net.MulticastSocket;  

  47.   

  48. public class MultiCastReceive {  

  49.     public static void main(String[]args){  

  50.         try {  

  51.             //IP組  

  52.             InetAddress ip = InetAddress.getByName("228.5.6.7");  

  53.             //組播監聽端口  

  54.             MulticastSocket s = new MulticastSocket(6789);  

  55.             //加入該組   

  56.             s.joinGroup(ip);  

  57.   

  58.             byte[] arb = new byte[24];  

  59.             while (true) {  

  60.                 DatagramPacket datagramPacket = new DatagramPacket(arb,arb.length);  

  61.                 s.receive(datagramPacket);  

  62.                 System.out.println(new String(datagramPacket.getData(), 0, datagramPacket.getLength()));  

  63.                 System.out.println(arb.length);  

  64.                 System.out.println(new String(arb));  

  65.             }  

  66.         } catch (Exception e) {  

  67.             // TODO Auto-generated catch block  

  68.             e.printStackTrace();  

  69.         }  

  70.     }  

  71. }  

 注:若在互聯網上運行須要支持多播的路由器的支持(不可能每一個客戶端都安裝相應的路由器,所以多播能夠說,只支持局域網。)

 

Java廣播代碼  收藏代碼

  1. package com.goma.test;  

  2.   

  3. import java.net.DatagramPacket;  

  4. import java.net.DatagramSocket;  

  5. import java.net.InetAddress;  

  6.   

  7. public class BroadCastSend {  

  8.   

  9.     /**  

  10.      * @param args  

  11.      */  

  12.     public static void main(String[] args) {  

  13.         // TODO Auto-generated method stub  

  14.         try {  

  15.             InetAddress ip = InetAddress.getByName("255.255.255.255");  

  16.             DatagramSocket ds = new DatagramSocket();  

  17.             String str = "Goma God Like.";  

  18.             DatagramPacket dp = new DatagramPacket(str.getBytes(),str.getBytes().length, ip, 3001);  

  19.             ds.send(dp);  

  20.             ds.close();  

  21.         } catch (Exception e) {  

  22.             // TODO Auto-generated catch block  

  23.             e.printStackTrace();  

  24.         }// 建立用來發送數據報包的套接字    

  25.     }  

  26. }  

  27.   

  28.   

  29.   

  30. package com.goma.test;  

  31.   

  32. import java.net.DatagramPacket;  

  33. import java.net.DatagramSocket;  

  34.   

  35. public class BroadCastReceive {  

  36.   

  37.     /**  

  38.      * @param args  

  39.      */  

  40.     public static void main(String[] args) {  

  41.         // TODO Auto-generated method stub  

  42.         try{  

  43.             DatagramSocket ds = new DatagramSocket(3001);// 建立接收數據報套接字並將其綁定到本地主機上的指定端口    

  44.             byte[] buf = new byte[1024];   

  45.             DatagramPacket dp = new DatagramPacket(buf, buf.length);  

  46.             ds.receive(dp);    

  47. //          String strRecv = new String(dp.getData(), 0, dp.getLength()) + " from "   + dp.getAddress().getHostAddress() + ":" + dp.getPort();   

  48.             System.out.println(new String(buf));    

  49.         }catch (Exception e) {  

  50.             // TODO: handle exception  

  51.             e.printStackTrace();  

  52.         }  

  53.     }  

  54.   

  55. }  

相關文章
相關標籤/搜索