diff --git a/assignments/src/MV3500Cohort2023MarchJune/homework2/Islas/HW2.java b/assignments/src/MV3500Cohort2023MarchJune/homework2/Islas/HW2.java new file mode 100644 index 0000000000000000000000000000000000000000..524ca4a85a2b8fc07d09262f28968c0c411b2f08 --- /dev/null +++ b/assignments/src/MV3500Cohort2023MarchJune/homework2/Islas/HW2.java @@ -0,0 +1,117 @@ +package MV3500Cohort2023MarchJune.homework2.Islas; + +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 <a href="https://docs.oracle.com/javase/tutorial/networking/datagrams/index.html">https://docs.oracle.com/javase/tutorial/networking/datagrams/index.html</a> + * @see <a href="https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html">https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html</a> + * @see <a href="https://en.wikipedia.org/wiki/User_Datagram_Protocol">https://en.wikipedia.org/wiki/User_Datagram_Protocol</a> + * @author mcgredo + * @author brutzman@nps.edu + */ +public class UnicastUdpReceiver +{ + /** Default constructor */ + public UnicastUdpReceiver() + { + // default constructor + } +// public static final int SENDING_PORT = 1414; // port used by UdpSender, unneeded here + /** socket value of shared interest */ + public static final int UDP_PORT = 1415; // sharable + /** socket value of shared interest */ + public static final String DESTINATION_HOST = "localhost"; + + /** + * Program invocation, execution starts here + * @param args command-line arguments + */ + public static void main(String[] args) + { + DatagramSocket udpSocket = null; + + try + { + // System.out.println(UnicastUdpReceiver.class.getName() + " started..."); + System.out.println("What is the airspeed velocity of an unladen Swallow?"); + + // Create a UDP socket + udpSocket = new DatagramSocket(UDP_PORT); + udpSocket.setReceiveBufferSize(1500); // how many bytes are in buffer? MTU=1500 is good + udpSocket.setBroadcast(false); // we're just receiving here +// udpSocket.setReuseAddress(true); + + 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 + + if (packetCount == 1) + { + if (udpSocket.getInetAddress() == null) + System.out.println("UdpReceiver address/port: UDP socket address null (loopback)" + "/" + UDP_PORT); + else System.out.println("UdpReceiver address/port: " + udpSocket.getInetAddress().getHostAddress() + "/" + UDP_PORT); + } + + // 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 = ""; + + if (firstInt == 11) { + System.out.println("You may pass"); + } + else { + System.out.println("Pull the lever!"); + } + + // System.out.println("[" + UnicastUdpReceiver.class.getName() + "]" + + // " port=" + UDP_PORT + + // " 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(UnicastUdpReceiver.class.getName() + " complete."); // all done + } + } +}