package MV3500Cohort2018JanuaryMarch.homework2;




import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


/**
 * homework assignment
 * @author Ken
 */
public class MaroonMulticastReceiver
{
    /**
     * Default constructor to silence javadoc warning
     * @see <a href="https://stackoverflow.com/questions/4488716/java-default-constructor" target="_blank">StackOverflow: Java default constructor</a>
     */
    public MaroonMulticastReceiver ()
    {
        // default initializations 
    }
    /** socket parameter of interest */
    public static final String MULTICAST_ADDRESS = "239.1.2.15";
    /** socket parameter of interest */
    public static final int DESTINATION_PORT = 1717;
    /** How many routers can be crossed */
    static final int TTL = 10; 
      
    /** run the program
     * @param args command-line arguments, string parameters (unused) */
    public static void main(String[] args) 
    {
        JFrame guiFrame = new JFrame();
        guiFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        guiFrame.setTitle("Read a message");
        guiFrame.setSize(300,250);
        guiFrame.setLocationRelativeTo(null);
        
        final JPanel output = new JPanel();
        output.setVisible(true);
        JLabel outputLbl= new JLabel("Hit the Button");
        output.add(outputLbl);
        
        JButton MCButton = new JButton( "Push Me");
 
        MCButton.addActionListener(new ActionListener(){
            @Override
            @SuppressWarnings("deprecation")
            public void actionPerformed(ActionEvent event){
                try {
        
                    // This is a java/IPv6 problem. You should also add it to the
                    // arguments used to start the app, eg -Djava.net.preferIPv4Stack=true
                    // set in the "run" section of preferences. Also, typically
                    // netbeans must be restarted after these settings.
                    // https://stackoverflow.com/questions/18747134/getting-cant-assign-requested-address-java-net-socketexception-using-ehcache
                    System.setProperty("java.net.preferIPv4Stack", "true");
            
            
                    MulticastSocket multicastSocket = new MulticastSocket(DESTINATION_PORT);
                    multicastSocket.setTimeToLive(TTL);
                    InetAddress multicastAddress = InetAddress.getByName(MULTICAST_ADDRESS);
                    System.out.println(multicastAddress);            
                    // Join group useful on receiving side
                    multicastSocket.joinGroup(multicastAddress);
                    // You can join multiple groups here
            
                    int count = 0;
            
                    byte[] packetArray = new byte[1500];
                    DatagramPacket packet = new DatagramPacket(packetArray, packetArray.length);
                
                    multicastSocket.receive(packet);
                    count++;
                
                    ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData());
                    DataInputStream dis = new DataInputStream(bais);
                    int firstNumber = dis.readInt();
                    int messageLength = dis.readInt();
                    String message = "";
                        for (int i = 0; i < messageLength; i++){
                            message += dis.readChar();
                        }
              
                   
                    outputLbl.setText(message);
                
                    System.out.println("Number received: " + count + " First number:" + firstNumber + " message:" + message);     
                }
                catch(Exception e){
                    System.out.println(e);
                 }
            }
        }
        );
 
  
        guiFrame.add(output, BorderLayout.CENTER);
        guiFrame.add(MCButton,BorderLayout.NORTH);
        guiFrame.setVisible(true);
        

    }
    
}