多播(multicast): 可以进行 ‘一对一’ 或者 ‘一对多’ 的 传输。
使用 D 类 IP 地址: (224.0.0.0, 239.255.255.255]
多播的存在意义: 比单播高效,比广播精准
单播,多播,广播的对比:
单播Unicast | 广播Broadcast | 多播Multicast | |
Mechanism 机制上: | sender传输给广播域(broadcast domain)中的所有receiver | sender传输给多播组(multicast group)中 receiver | |
Bandwidth 带宽上: | 一对一的传输方式可能会出现严重的网络拥塞 | 多播将单个信息发送给加入’多播组’中的接收者。(只传输一个数据包会显著减少通信量,从而最大限度地利用网络带宽。) | |
Protocol 协议上: | 单播应用程序可以在传输层使用TCP或UDP | 多播应用程序使用UDP。 (因此,应用层必须为多播操作提供可靠性数据传输机制,例如序列号、计时器和重传。) |
Sender 发送方代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class MultiC_S {
public static void main(String[] ar) throws IOException {
Scanner sc = new Scanner(System.in);
System.out.print("Message = ");
String str = sc.next();
InetAddress ia = InetAddress.getByName("239.255.255.255");
DatagramPacket dp = new DatagramPacket(str.getBytes(), str.getBytes().length,
ia, 10000); //数值(10000)与receiver中一致
MulticastSocket ms = new MulticastSocket();
ms.send(dp);
ms.close();
}
}
Receiver 接收方代码:
import java.io.*;
import java.net.*;
import java.util.*;
public class MultiC_R {
public static void main(String[] ar) throws IOException {
DatagramPacket dp = new DatagramPacket(new byte[1000], 1000);
MulticastSocket ms = new MulticastSocket(10000); //数值与sender中一致
InetAddress ia = InetAddress.getByName("239.255.255.255");
ms.joinGroup(ia); //加入多播组
ms.receive(dp);
ms.leaveGroup(ia);
ms.close();
System.out.println("Sender = " + dp.getAddress().getHostAddress());
System.out.print("Message = " + new String(dp.getData()));
}
}
cmd运行结果