package MV3500Cohort2020JulySeptember.homework3.Cannon;

import java.io.*;
import java.net.*;

/**
 * An example of receiving UDP packets. Since very often both the
 * sender and receiver are on the same host we use different ports
 * for each. This prevents collision complaints from the localhost.
 * 
 * Start this before launching UdpSender.
 * 
 * @see https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html
 * @see https://en.wikipedia.org/wiki/User_Datagram_Protocol
 * @author mcgredo
 * @author brutzman
 */
public class CannonUdpReceiver 
{
//  public static final int       SENDING_PORT = 1414; // port used by UdpSender, unneeded here
    public static final int     RECEIVING_PORT = 1415;
    public static final String DESINATION_HOST = "localhost";

    /**
     * @param args the command line arguments
     * @throws java.io.IOException
     */
    public static void main(String[] args) throws IOException 
    {
        DatagramSocket udpSocket = null;
        
        try
        {
            System.out.println(CannonUdpReceiver.class.getName() + " started...");
            
            // Create a UDP socket
            udpSocket = new DatagramSocket(RECEIVING_PORT);
            udpSocket.setReceiveBufferSize(1500); // how many bytes are in buffer?  MTU=1500 is good
            udpSocket.setBroadcast(false);        // we're just receiving here
            
            byte[] byteArray = new byte[1500];
            DatagramPacket receivePacket = new DatagramPacket(byteArray, byteArray.length);
            
            ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
            DataInputStream dis = new DataInputStream(bais);
            
            boolean       isEvenParity;
            int           packetCount = 0;
            int           firstInt;   
            float         secondFloat;
            String        thirdString;
            String        padding;
            
            // You need a new receiving packet to read from every packet received
            while (true)
            {
                packetCount++; // good practice to increment counter at start of loop, when possible
                udpSocket.receive(receivePacket); // blocks until packet is received
                
                // values of interest follow. order and types of what was sent must match what you are reading!
                firstInt     = dis.readInt();     // packetID
                secondFloat  = dis.readFloat();
                thirdString  = dis.readUTF();     // string value with guaranteed encoding, matches UTF-8 is 8 bit
                isEvenParity = dis.readBoolean(); // ok, we've gotten everything we're looking for.  
                
                dis.reset(); // now clear the input stream after reading, in preparation for next loop
                
                if  (isEvenParity) 
                     padding = " ";
                else padding = "";
                
                System.out.println("[" + CannonUdpReceiver.class.getName() + "]" + 
                                               " packetID="   + firstInt +            // have output message use same name as sender
                                     ", second float value="   + secondFloat  + 
                                     ", third String value=\"" + thirdString  + "\"" + // note that /" is literal quote character
                                    " isPacketIdEvenParity="   + isEvenParity + ","  + padding +
                                     " packet counter="        + packetCount);
            }
        }
        catch(IOException e)
        {
            System.err.println("Problem with UdpReceiver, see exception trace:");
            System.err.println(e);
        } 
        finally // clean up prior to exit, don't want to leave behind zombie socket
        {
            if (udpSocket != null)
                udpSocket.close();
            System.out.println(CannonUdpReceiver.class.getName() + " complete."); // all done
        }
    }
}