MulticastSocket 广播数据报
- 这种通信类似于收音机的广播,用户只要调到指定的频道上就能收听到广播的内容。要想实现这个功能,需要使用特殊的 IP 地址。要想实现多播或广播通信的主机都必须加入同一个 D 类地址中。D 类地址的十进制表示范围是 224.0.0.0~239.255.255.255;
- 要实现广播,需要使用 MulticastSocket 类。该类是一种基于 UDP 的 DatagramSocket,用于发送和接收 IP 多播包。该类的对象可以加入 Internet 上其他多播主机的“组”中。类 DatagramSocket 的常用方法如下:
(1)MulticastSocket(int port) throws IOException
:创建一个多播套接字,并将其绑定到指定端口上;
(2)MulticastSocket(SocketAddress bindaddr) throws IOException
:创建一个多播套接字,并将其绑定到一个指定套接字地址上;
(3)public void joinGroup(InetAddress mcastaddr) throws IOException
:将多播套接字加入指定多播组;
(4)public void leaveGroup(InetAddress mcastaddr) throws IOException
:将多播套接字移出多播组;
(5)public void setTimeToLive(int ttl) throws IOException
:设置在此 MulticastSocket 上发出的多播数据包的默认生存时间; - java.net.MulticastSocket,详见:Class MulticastSocket;
- ttl 参数设置数据包最多可以跨过多少个网络:
- 当 ttl 为 0 时,数据包应停留在本地主机;
- 当 ttl 为 1 时,数据包应发送到本地局域网;
- 当 ttl 为 32 时,数据包应发送到本站点的网络上;
- 当 ttl 为 64 时,数据包应保留在本地区;
- 当 ttl 为 128 时,数据包应保留在本大洲;
- 当 ttl 为 255 时,数据包可以发送到所有地方;
1. 应用:广播数据报
a. 发送端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
class BroadCast {
public void send() {
String msg = "Hello,This is Broadcast Message";
int port = 6666;
InetAddress group = null;
MulticastSocket ms = null;
try {
group = InetAddress.getByName("224.1.1.1");
ms = new MulticastSocket(port);
ms.joinGroup(group);
ms.setTimeToLive(1);
DatagramPacket dp = new DatagramPacket(msg.getBytes(), msg.length(), group, port);
ms.send(dp);
} catch (IOException e) {
System.out.println(e);
} finally {
ms.close();
}}}
public class BroadcastTest {
public static void main(String[] args) {
new BroadCast().send();
}
}
b. 接收端
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
class Receiver {
public void receive() {
byte[] data = new byte[1024];
int port = 6666;
InetAddress group = null;
MulticastSocket ms = null;
try {
group = InetAddress.getByName("224.1.1.1");
ms = new MulticastSocket(port);
ms.joinGroup(group);
DatagramPacket dp = new DatagramPacket(data, data.length, group, port);
ms.receive(dp);
String msg = new String(dp.getData(), 0, dp.getLength());
System.out.println("接收的广播数据为:" + msg);
} catch (IOException e) {
System.out.println(e);
} finally {
ms.close();
}
}
}
public class ReceiverTest {
public static void main(String[] args) {
new Receiver().receive();
}
}
c. 运行演示
- 先运行接收端,再运行广播端,广播端发送消息,客户端收到该消息后将其显示出来: