组播:
组播是指把信息同时传递给一组目的地址。它使用的策略是最高效的,因为消息在每条网络链路上只需传递一次,且只有在链路分叉的时候,消息才会被复制。与多播相比,常规的点到单点传递被称作单播。当以单播的形式把消息传递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送方效率低下,且缺乏可扩展性。不过,许多流行的协议——例如XMPP,用限制接收者数量的方法弥补了这一不足。
来自维基百科
代码实现:
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;
import java.util.concurrent.TimeUnit;
public class MuiltcastDemo {
private static int PORT = 5555;
private static String MULTICAST_ADDRESS = "225.0.0.1";
static class MulticastClient {
private MulticastSocket socket;
private String id;
private InetAddress group;
private int port;
public MulticastClient(final String id, InetAddress group, int port) throws IOException {
this.id = id;
this.group = group;
this.port = port;
socket = new MulticastSocket(port);
socket.joinGroup(group);
final byte[] buf = new byte[256];
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
DatagramPacket packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
String msg = new String(packet.getData());
System.out.println("客户端" + id + "接受到的数据:" + msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
public void send(String msg) {
byte[] bytes = msg.getBytes();
try {
socket.leaveGroup(group);//发送的人不接收组播消息
msg = "客户端" + id + "发送数据:" + msg;
System.out.println(msg);
socket.send(new DatagramPacket(bytes, bytes.length, group, port));
socket.joinGroup(group);
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws UnknownHostException, IOException, InterruptedException {
MulticastClient mcA = new MulticastClient("A", InetAddress.getByName(MULTICAST_ADDRESS), PORT);
MulticastClient mcB = new MulticastClient("B", InetAddress.getByName(MULTICAST_ADDRESS), PORT);
MulticastClient mcC = new MulticastClient("C", InetAddress.getByName(MULTICAST_ADDRESS), PORT);
mcA.send("Hello!");
TimeUnit.SECONDS.sleep(2);
mcB.send("Hello!");
TimeUnit.SECONDS.sleep(2);
mcC.send("Hello!");
TimeUnit.SECONDS.sleep(2);
}
}