UDP廣播與多播

來源:http://158067568.iteye.com/blog/901052

UDP廣播與多播

作者:legend

QQ:158067568

使用UDP協議進行信息的傳輸之前不需要建議連接。換句話說就是客戶端向服務器發送信息,客戶端只需要給出服務器的ip地址和端口號,然後將信息封裝到一個待發送的報文中並且發送出去。至於服務器端是否存在,或者能否收到該報文,客戶端根本不用管。

通常我們討論的udp的程序都是一對一的單播程序。本章將討論一對多的服務:廣播(broadcast)、多播(multicast)。對於廣播,網絡中的所有主機都會接收一份數據副本。對於多播,消息只是發送到一個多播地址,網絡知識將數據分發給哪些表示想要接收發送到該多播地址的數據的主機。總得來說,只有UDP套接字允許廣播或多播。

UDP廣播

廣播UDP與單播UDP的區別就是IP地址不同,廣播使用廣播地址255.255.255.255,將消息發送到在同一廣播網絡上的每個主機。值得強調的是:本地廣播信息是不會被路由器轉發。當然這是十分容易理解的,因爲如果路由器轉發了廣播信息,那麼勢必會引起網絡癱瘓。這也是爲什麼IP協議的設計者故意沒有定義互聯網範圍的廣播機制。

廣播地址通常用於在網絡遊戲中處於同一本地網絡的玩家之間交流狀態信息等。廣播就不在寫演示程序了,讀者可以將ECHO程序的ip地址改爲廣播地址即可。

其實廣播顧名思義,就是想局域網內所有的人說話,但是廣播還是要指明接收者的端口號的,因爲不可能接受者的所有端口都來收聽廣播。

UDP多播

同樣的UDP多播也要指明接受者的端口號,而且與廣播相似的是多播與單播之間的區別還在於地址。ipv4中的多播地址範圍是:224.0.0.0到239.255.255.255。在JAVA中,多播一樣十分好實現,要實現多播,就要用到MulticastSocket類,其實該類就是DatagramSocket的子類,在使用時除了多播自己的一些特性外,把它當做DatagramSocket類使用就可以了。下面將給出一個簡單的多播接受數據的例子:

Java代碼  收藏代碼
  1. <strong>package cn.edu.heut.zcl.multicast;  
  2.   
  3.    
  4.   
  5. import java.net.DatagramPacket;  
  6.   
  7. import java.net.InetAddress;  
  8.   
  9. import java.net.MulticastSocket;  
  10.   
  11.    
  12.   
  13. public class UDPMulticastServer {  
  14.   
  15.          final static int RECEIVE_LENGTH = 1024;  
  16.   
  17.          static String multicastHost="224.0.0.1";  
  18.   
  19.          static int localPort = 9998;  
  20.   
  21.          public static void main(String[] args) throws Exception {  
  22.   
  23.                      
  24.   
  25.                    InetAddress receiveAddress =InetAddress.getByName(multicastHost);  
  26.   
  27.                    if(!receiveAddress.isMulticastAddress()){//測試是否爲多播地址  
  28.   
  29.                             throw new Exception("請使用多播地址");  
  30.   
  31.                    }  
  32.   
  33.                    int port = localPort;  
  34.   
  35.                    MulticastSocket receiveMulticast = new MulticastSocket(port);  
  36.   
  37.                    receiveMulticast.joinGroup(receiveAddress);  
  38.   
  39.                    DatagramPacket dp = new DatagramPacket(new byte[RECEIVE_LENGTH], RECEIVE_LENGTH);  
  40.   
  41.                    receiveMulticast.receive(dp);  
  42.   
  43.                    System.out.println(new String(dp.getData()).trim());  
  44.   
  45.                    receiveMulticast.close();  
  46.   
  47.          }  
  48.   
  49. }  
  50.   
  51. </strong>  

 

 

 

 

 

接下來實現多播發送方的代碼:

Java代碼  收藏代碼
  1. package cn.edu.heut.zcl.multicast;  
  2.   
  3.    
  4.   
  5. import java.net.DatagramPacket;  
  6.   
  7. import java.net.InetAddress;  
  8.   
  9. import java.net.MulticastSocket;  
  10.   
  11.    
  12.   
  13. public class UDPMulticastClient {  
  14.   
  15.    
  16.   
  17.                    static String destAddressStr = "224.0.0.1";  
  18.   
  19.                    static int destPortInt = 9998;  
  20.   
  21.                    static int TTLTime = 4;  
  22.   
  23.          public static void main(String[] args) throws Exception {  
  24.   
  25.                      
  26.   
  27.                    InetAddress destAddress = InetAddress.getByName(destAddressStr);  
  28.   
  29.                    if(!destAddress.isMulticastAddress()){//檢測該地址是否是多播地址  
  30.   
  31.                             throw new Exception("地址不是多播地址");  
  32.   
  33.                    }  
  34.   
  35.                    int destPort = destPortInt;  
  36.   
  37.                    int TTL = TTLTime;  
  38.   
  39.                    MulticastSocket multiSocket =new MulticastSocket();  
  40.   
  41.                    multiSocket.setTimeToLive(TTL);  
  42.   
  43.                    byte[] sendMSG = "11#msg".getBytes();  
  44.   
  45.                    DatagramPacket dp = new DatagramPacket(sendMSG, sendMSG.length, destAddress  , destPort);  
  46.   
  47.                    multiSocket.send(dp);  
  48.   
  49.                    multiSocket.close();  
  50.   
  51.          }  
  52.   
  53. }  

 

 

在多播中設置了TTl值(Time to live),每一個ip數據報文中都包含一個TTL,每當有路由器轉發該報文時,TTL減1,知道減爲0時,生命週期結束,報文即時沒有到達目的地,也立即宣佈死亡。當然在Java中,ttl並不是十分準確的,曾經在一本書中介紹過報文的傳播距離是不會超過ttl所設置的值的。

發佈了36 篇原創文章 · 獲贊 7 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章