java点滴之MulticastSocket的使用

一基本概念

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

DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送到多个客户端 

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

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为客户端发送广播消息,个人理解是将A、B两台机器的MulticastSocket对象绑定在组播地址中的其中一个,然后C客户端发送消息的组播地址一致,则A、B就能够接收C发送的消息。 
如果MulticastSocket用于接收信息则使用默认地址和随机端口即可,但是如果用来接收信息,则必须要指定端口,否则发送方无法确定发送数据报的目标端口。

三代码示例

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);





你可能感兴趣的:(多线程,编程,socket,NetWork,interface)