package MV3500Cohort2018JanuaryMarch.homework2; import java.io.*; import java.net.*; import java.util.Random; /** * Looks a lot like a UDP sender. * * @author mcgredo */ public class AngelMulticastSenderExample { /** socket value of shared interest */ public static final String MULTICAST_ADDRESS = "239.1.2.15"; /** socket value of shared interest */ public static final int DESTINATION_PORT = 1717; /** How many routers can be crossed */ public static final int TTL = 10; /** run the program * @param args command-line arguments, string parameters (unused) */ public static void main(String[] args) { 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(1718); 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 // Put together a message with binary content. "ByteArrayOutputStream" // is a java.io utility that lets us put together an array of binary // data, which we put into the UDP packet. ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); Random randomFLT = new Random(); Random rndFLT = new Random(); for(int idx = 0; idx < 100; idx++){ float flt = rndFLT.nextFloat(); if (flt <=.5){ dos.writeChars("A"); dos.writeFloat(randomFLT.nextFloat()*100); dos.writeFloat(randomFLT.nextFloat()*100); dos.writeFloat(randomFLT.nextFloat()*100); } else if (flt < .8 ) { dos.writeChars("B"); dos.writeInt("Information Bravo.".length()); dos.writeChars("Information Bravo."); } else { dos.writeChars("B"); dos.writeInt("Information Charlie.".length()); dos.writeChars("Information Charlie."); } byte[] buffer = baos.toByteArray(); // Put together a packet to send // muticast group we are sending to--not a single host DatagramPacket packet = new DatagramPacket(buffer, buffer.length, multicastAddress, DESTINATION_PORT); // How fast does this go? Does UDP try to slow it down, or does // this cause network problems? (hint: yes for an unlimited send // rate, unlike TCP). How do you know on the receiving side // that you haven't received a duplicate UDP packet, out of // order packet, or dropped packet? multicastSocket.send(packet); baos.reset(); Thread.sleep(1000); // Send 100, one per second System.out.println("Sent multicast packet " + idx + " of 100"); } } catch(Exception e) { System.out.println(e); } } }