Java网络编程 Ch13 IP组播

组播地址和组

组播–介于点对点传播和广播之间。

组播地址(multicast address)是称为组播组(multicast group)的一组主机共享地址。

组播组是一组共享一个组播地址的主机。任何发送给该组播地址的数据都会中继给组中所有成员。

image

MulticastSocket

public class MulticastSocket extends DatagramSocket 
package ch13;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;

public class MulticastSniffer {

    public static void main(String[] args) {

        InetAddress group = null;
        int port = 0;

        try {
            group = InetAddress.getByName(args[0]);
            port = Integer.parseInt(args[1]);
        }catch(ArrayIndexOutOfBoundsException | NumberFormatException | UnknownHostException ex) {
            System.err.println("Usage: java MulticastSniffer multicast_address port");
            System.exit(1);
        }

        MulticastSocket ms = null;
        try {
          //新建绑定到指定端口的组播Socket,如果已经被占用,抛出异常。
          //可以是端口、SocketAddress,以及空
            ms = new MulticastSocket(port);
          //加入组播。加入后才能接受组播的信息。进入前也可以向组播发送信息。
            ms.joinGroup(group);
            byte[] buffer = new byte[8192];
          //接受和发送,和DatagramSocket一致
            while(true) {
              //新建数据报,
                DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
                ms.receive(dp);
                String s = new String(dp.getData(),"8859_1");
                System.out.println(s);
            }
        }catch(IOException ex) {
            System.err.println(ex);
        }finally {
            if(ms!=null) {
                try {
                  //脱离组播
                    ms.leaveGroup(group);
                    ms.close();
                }catch(IOException ex) {
                }
            }
        }
    }

}


package ch13;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.SocketException;
import java.net.UnknownHostException;

public class MulticastSender {

    public static void main(String[] args) {
        InetAddress ia = null;
        int port = 0;
        byte ttl = (byte)1;

        try {
            ia = InetAddress.getByName(args[0]);
            port = Integer.parseInt(args[1]);
            if(args.length>2) ttl = (byte) Integer.parseInt(args[2]);
        }catch(NumberFormatException|IndexOutOfBoundsException|UnknownHostException ex) {
            System.err.println(ex);
            System.err.println("Usage: java MulticastSender multicast_address port ttl");
            System.exit(1);
        }

        byte[] data ="Here's some multicast data\r\n".getBytes();
        DatagramPacket dp = new DatagramPacket(data, data.length, ia, port);

        try(MulticastSocket ms = new MulticastSocket()) {
            //设置继承于基类的send方法。能传播的路由器数
            //send(Datagrampacket dp, byte ttl)该类自带方法。
            ms.setTimeToLive( ttl);
            ms.joinGroup(ia);
            for(int i=0; i<10; i++) {
                ms.send(dp);
            }
            ms.leaveGroup(ia);
        }catch(SocketException ex) {
            System.err.println(ex);
        }catch(IOException ex) {
            System.err.println(ex);
        }

    }

}
回送

一台主机是否接受他自己发送的组播包。

public void setLoopbackMode(true)//表示不希望回送。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值