天天看点

Java实现组播

组播:

组播是指把信息同时传递给一组目的地址。它使用的策略是最高效的,因为消息在每条网络链路上只需传递一次,且只有在链路分叉的时候,消息才会被复制。与多播相比,常规的点到单点传递被称作单播。当以单播的形式把消息传递给多个接收方时,必须向每个接收者都发送一份数据副本。由此产生的多余副本将导致发送方效率低下,且缺乏可扩展性。不过,许多流行的协议——例如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);
	}
	
}

           

控制台输出:

Java实现组播