首页 > 代码库 > java点滴之MulticastSocket的使用

java点滴之MulticastSocket的使用

一基本概念

该类恰是上文介绍的DatagramSocket的子类。

DatagramSocket仅仅同意数据报发送给指定的目标地址,而MulticastSocket能够将数据报以广播的方式发送到多个client 

若要使用多点广播,则须要让一个数据报标有一组目标主机地址,当数据报发出后,整个组的全部全部主机都能收到该数据报。IP多点广播(或多点发送)实现了将单一信息发送到多个接受者的广播,其思想是设置一组特殊网络地址作为多点广播地址,每个多点广播地址都被看做一个组,当client须要发送、接收广播信息时,增加到改组就可以。

MulticastSocket既能够将数据报发送到多点广播地址,也能够接收其它主机的广播信息。


作为子类,最大的扩展就是它提供方法:
1.joinGroup(InetAddress mcastaddr)
2.joinGroup(SocketAddress mcastaddr, NetworkInterface netIf)
3.leaveGroup(InetAddress mcastaddr)
4.leaveGroup(SocketAddress mcastaddr, NetworkInterface netIf)
5.get/setInterface(InetAddress inf)
6. get/setNetworkInterface(NetworkInterface netIf)

注:
NetworkInterface 网络接口类
什么是网络接口:网络接口名并非计算机名,而是用于标识物理或逻辑网络接口的名字,通常是由操作系统设置的。网络接口名在大多数操作系统上(包含Windows、Linux和Unix)是以eth开头,后面是网络接口的索引號,从0開始。如本机安了三块网卡,那么网络接口名就依次是eth0、eth1和eth2。每一个网络接口都能够绑定一个ip地址,也能够据此得到设备的MAC地址。
方法:1. Enumeration<InetAddress> getInetAddresses():一个 Enumeration 对象,具有绑定到此网络接口的所有或部分 InetAddress

二 方法简单介绍

 创建MulticastSocket对象后,还须要将该MulticastSocket增加到指定的多点广播地址,MulticastSocket使用joinGroup()方法增加指定组;使用leaveGroup()方法脱离一个组。

1、joinGroup(InetAddress multicastAddr):将该MulticastSocket增加指定的多点广播地址。

2、leaveGroup(InetAddress multicastAddr):让该MulticastSocket离开指定的多点广播地址。


应用程序仅仅将数据报包发送给组播地址,路由器将确保包被发送到改组播组中的全部主机。 
组播地址:称为组播组的一组主机所共享的地址。组播地址的范围在224.0.0.0--- 239.255.255.255之间(都为D类地址 1110开头)。 
备注:假设如今有三台机器A、B、C,三台机器IP地址都不一样,A\B为server监听广播消息,C为client发送广播消息,个人理解是将A、B两台机器的MulticastSocket对象绑定在组播地址中的当中一个,然后Cclient发送消息的组播地址一致,则A、B就行接收C发送的消息。 
假设MulticastSocket用于接收信息则使用默认地址和随机port就可以,可是假设用来接收信息,则必需要指定port,否则发送方无法确定发送数据报的目标port。

三代码演示样例

MulticastSocket _socket = new MulticastSocket(5353);
        InetSocketAddress sockaddr = new InetSocketAddress(224.0.0.251, 5353);
        
            try {
                _socket.setNetworkInterface(hostInfo.getInterface());
                _socket.joinGroup(sockaddr, hostInfo.getInterface());
            } catch (SocketException e) {
                DLog.w(TAG, TAGClass + "openMulticastSocket() Set network interface exception: "
                        + e.getMessage());
            }
        }
        _socket.setTimeToLive(255);