import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.Socket;


public class MulticastExample {
	public static int BUFFER_SIZE = 1000;
	public static int GROUP_PORT = 5678;
	
	public static void main(String[] args) {
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			final MulticastSocket socket = new MulticastSocket(GROUP_PORT);
			
			Thread thread = new Thread(new Runnable() {
				public void run() {
					byte[] bytes = new byte[BUFFER_SIZE];
					DatagramPacket recvPacket = new DatagramPacket(bytes, BUFFER_SIZE);
					while (true) {
						try {
							socket.receive(recvPacket);
							String content = new String(bytes, 0, recvPacket.getLength());
							System.out.println("Multicast message received: " + content);
						} catch (Exception e) {
							e.printStackTrace();
						}
						
					}
				}
			});
			thread.start();
			
			int count = 1;
			while (true) {
				System.out.println("Would you like to \n\t1.Join a group\n\t2.Leave a group\n\t3.Send a message");
				int choice = Integer.parseInt(in.readLine());
				if (choice == 1) {
					System.out.println("Enter group address to join (must be between 224.0.0.0 and 239.255.255.255)");
					String address = in.readLine();
					socket.joinGroup(InetAddress.getByName(address));
				} else if (choice == 2) {
					System.out.println("Enter group address to join (must be between 224.0.0.0 and 239.255.255.255)");
					String address = in.readLine();
					socket.leaveGroup(InetAddress.getByName(address));
				} else if (choice == 3) {
					System.out.println("Enter address");
					String address = in.readLine();
					System.out.println("Enter message");
					String message = in.readLine();
					DatagramPacket packet = new DatagramPacket(message.getBytes(), message.length(), 
							InetAddress.getByName(address), GROUP_PORT);
					socket.send(packet);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		
	}
}

