package UdpExamples; 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" target="_blank">https://docs.oracle.com/javase/tutorial/networking/datagrams/index.html</a> * @see <a href="https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html" target="_blank">https://docs.oracle.com/javase/tutorial/essential/io/datastreams.html</a> * @see <a href="https://en.wikipedia.org/wiki/User_Datagram_Protocol" target="_blank">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..."); // 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 = ""; 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(); // making sure the perhaps-scarce resource is released System.out.println(UnicastUdpReceiver.class.getName() + " complete."); // all done } } }