• 【收藏】UDP广播和多播


    UDP广播与多播

    作者:legend

    使用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类使用就可以了。下面将给出一个简单的多 播接受数据的例子:

    1. <span style="font-family:'Microsoft YaHei';font-size:16px;">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.                    InetAddress receiveAddress =InetAddress.getByName(multicastHost);  
    24.   
    25.                    if(!receiveAddress.isMulticastAddress()){//测试是否为多播地址  
    26.   
    27.                             throw new Exception("请使用多播地址");  
    28.   
    29.                    }  
    30.   
    31.                    int port = localPort;  
    32.   
    33.                    MulticastSocket receiveMulticast = new MulticastSocket(port);  
    34.   
    35.                    receiveMulticast.joinGroup(receiveAddress);  
    36.   
    37.                    DatagramPacket dp = new DatagramPacket(new byte[RECEIVE_LENGTH], RECEIVE_LENGTH);  
    38.   
    39.                    receiveMulticast.receive(dp);  
    40.   
    41.                    System.out.println(new String(dp.getData()).trim());  
    42.   
    43.                    receiveMulticast.close();  
    44.   
    45.          }  
    46.   
    47. }  
    48. </span>  
    接下来实现多播发送方的代码:

    1. <span style="font-family:'Microsoft YaHei';font-size:16px;">package cn.edu.heut.zcl.multicast;</span>  
    1. <span style="font-family:'Microsoft YaHei';font-size:16px;">import java.net.DatagramPacket;  
    2. import java.net.InetAddress;  
    3. import java.net.MulticastSocket;  
    4. public class UDPMulticastClient {  
    5.                    static String destAddressStr = "224.0.0.1";  
    6.                    static int destPortInt = 9998;  
    7.                    static int TTLTime = 4;  
    8.          public static void main(String[] args) throws Exception {                   
    9.                    InetAddress destAddress = InetAddress.getByName(destAddressStr);  
    10.                    if(!destAddress.isMulticastAddress()){//检测该地址是否是多播地址  
    11.                             throw new Exception("地址不是多播地址");  
    12.                    }  
    13.                    int destPort = destPortInt;  
    14.                    int TTL = TTLTime;  
    15.                    MulticastSocket multiSocket =new MulticastSocket();  
    16.                    multiSocket.setTimeToLive(TTL);  
    17.                    byte[] sendMSG = "11#msg".getBytes();  
    18.                    DatagramPacket dp = new DatagramPacket(sendMSG, sendMSG.length, destAddress  , destPort);  
    19.                    multiSocket.send(dp);  
    20.                    multiSocket.close();  
    21.          }  
    22. }</span>  
    在多播中设置了TTl值(Time to live),每一个ip数据报文中都包含一个TTL,每当有路由器转发该报文时,TTL减1,知道减为0时,生命周期结束,报文即时没有到达目的地,也立即宣布死亡。当然在Java中,ttl并不是十分准确的,曾经在一本书中介绍过报文的传播距离是不会超过ttl所设置的值的。

     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为本地管理组播地址,仅在特定的本地范围内有效。

     

  • 相关阅读:
    Good Bye 2014 B. New Year Permutation(floyd )
    hdu 5147 Sequence II (树状数组 求逆序数)
    POJ 1696 Space Ant (极角排序)
    POJ 2398 Toy Storage (叉积判断点和线段的关系)
    hdu 2897 邂逅明下 (简单巴什博弈)
    poj 1410 Intersection (判断线段与矩形相交 判线段相交)
    HDU 3400 Line belt (三分嵌套)
    Codeforces Round #279 (Div. 2) C. Hacking Cypher (大数取余)
    Codeforces Round #179 (Div. 2) B. Yaroslav and Two Strings (容斥原理)
    hdu 1576 A/B (求逆元)
  • 原文地址:https://www.cnblogs.com/81/p/2281267.html
Copyright © 2020-2023  润新知