UDP广播与多播

来源:互联网 发布:多线程并发编程 编辑:程序博客网 时间:2024/04/27 16:06

来源: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所设置的值的。

原创粉丝点击