1. MulticastSocket 将数据报发送到广播地址(任意的D类可用IP地址),数据报会自动 “广播”所有假如该IP地址的Client。
2. MulticastSocket广播也是使用的UDP协议,同样要使用DatagramPacket。
注意三个方法:
public void setTimeToLive(int ttl)
throws IOException
通过设置ttl值(可跨过的网段数),控制广播范围(0 —— 数据只能停留在本机;1 —— 数据在当前局域网广播 ;32 —— 数据在本站点网络广播; 64 —— 数据在本地区广播;128 —— 数据在本大洲广播;255 —— 数据在全球广播)
public void joinGroup(InetAddress mcastaddr) throws IOException
public void leaveGroup(InetAddress mcastaddr) throws IOException
发送:方法与DatagramPacket的发送方法一样,只是数据包的地址是个 广播地址
接收:首先要调用 joinGroup()方法加入指定广播地址,再接收
示例代码:
BroadCast.java
import java.net.MulticastSocket; import java.net.InetAddress; import java.net.DatagramPacket; import java.util.Scanner; import java.io.IOException; public class BroadCast{ final static int BROAD_PORT = 2013; //定义MulticastSocket绑定的端口号 final static String BROAD_ADDRESS = "225.0.0.1"; //定义广播IP(任意可用的D类IP地址) static InetAddress mCastAddr; public static void main(String[] args){ try( //创建多播套接字并将其绑定到特定端口,用于发送/接收数据报 //MulticastSocket(int port) MulticastSocket castSocket = new MulticastSocket(BROAD_PORT); //键盘输入 Scanner scanner = new Scanner(System.in); ){ //返回指定主机的IP,这里是返回广播地址对应的InetAddress对象 //public static InetAddress getByName(String host) throws UnknownHostException mCastAddr = InetAddress.getByName(BROAD_ADDRESS); //设置数据在局域网内广播 —— TTL = 1 //public void setTimeToLive(int ttl) throws IOException castSocket.setTimeToLive(1); //加入多播组 //public void joinGroup(InetAddress mcastaddr) throws IOException castSocket.joinGroup(mCastAddr); /*******************************************/ // 启动一条线程,用于读取接收到的广播消息 new ReceiveThread(castSocket).start(); /******************************************/ while(scanner.hasNextLine()){//等待输入 //将键盘输入作为content(待发送数据) String content = scanner.nextLine(); //构造数据报报,作为发送给“广播”的数据报 //public DatagramPacket(byte[] buf,int length,InetAddress address,int port) DatagramPacket sendToBroadCastPacket = new DatagramPacket(content.getBytes(), content.getBytes().length,mCastAddr,BROAD_PORT); //MulticastSocket对象 castSocket调用send()方法发送数据报 castSocket.send(sendToBroadCastPacket); } } catch(IOException ex){ ex.printStackTrace(); } } } /******************用于接收数据报的线程类***************/ class ReceiveThread extends Thread{ private MulticastSocket castSocket; final static int PACKET_SIZE = 1024*4; public ReceiveThread(MulticastSocket castSocket){ this.castSocket = castSocket; } @Override public void run(){ //读取广播数据报 while(true){ try{ /********本质就是UDP数据包的读取 **********/ //public DatagramPacket(byte[] buf,int length) //构造 DatagramPacket,用来接收长度为 length 的数据包。 DatagramPacket receiveFromBroadPacket = new DatagramPacket(new byte[PACKET_SIZE],PACKET_SIZE); //castSocket调用receive()方法接收数据报 castSocket.receive(receiveFromBroadPacket); /************** 至此数据报接收过程完毕 *********/ //打印接收的数据 System.out.println(new String(receiveFromBroadPacket.getData(),0,receiveFromBroadPacket.getLength())); } catch(IOException ex){ ex.printStackTrace(); if(castSocket != null){//连接不为空 try{ //如果有连接断开 //public void leaveGroup(InetAddress mcastaddr) throws IOException castSocket.leaveGroup(BroadCast.mCastAddr); //public void close()关闭此数据报套接字。 castSocket.close(); } catch(IOException iex){ iex.printStackTrace(); } } } } } }