import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.Socket;


public class StreamingVideoExample {
	public static final int BUFFER_SIZE = 1000;
	
	public static void main(String[] args) {
		
		try {
			BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("Client (1) or Server (2)?");
			int choice = Integer.parseInt(in.readLine());
			if (choice == 2) {

				final MulticastSocket socket = new MulticastSocket();
				
				System.out.println("Enter an address of a group to broadcast to.");
				String address = in.readLine();
				InetAddress inet = InetAddress.getByName(address);
				System.out.println("Enter a port to broadcast on.");
				int port = Integer.parseInt(in.readLine());
				
				// Open socket to telnet server.
				Socket movieSocket = new Socket(InetAddress.getByName("towel.blinkenlights.nl"), 23);
			
				BufferedInputStream movieIn = new BufferedInputStream(movieSocket.getInputStream());
				byte[] bytes = new byte[BUFFER_SIZE];
				
				while (true) {
					int length = movieIn.read(bytes);
					
					DatagramPacket packet = new DatagramPacket(bytes, length, inet, port);
					socket.send(packet);
				}
			} else {
				System.out.println("Enter a port to receive on.");
				int port = Integer.parseInt(in.readLine());
				MulticastSocket socket = new MulticastSocket(port);
				System.out.println("Enter the address of a group to join.");
				String address = in.readLine();
				socket.joinGroup(InetAddress.getByName(address));
				
				byte[] buffer = new byte[BUFFER_SIZE];
				DatagramPacket packet = new DatagramPacket(buffer, BUFFER_SIZE);
				
				while (true) {
					socket.receive(packet);
					System.out.write(buffer, 0, packet.getLength());
					for (int i = 0; i < 5; i++) {
						System.out.println();
					}
				}
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

