From 68aaa91b81d1942197694e82e9ac38867a72eb0e Mon Sep 17 00:00:00 2001
From: Justin Snell <Justin Snell@DESKTOP-TKCRGLK.ern.nps.edu>
Date: Mon, 26 Feb 2018 13:07:19 -0800
Subject: [PATCH] SnellHW2

---
 .../Assignments/homework2/SnellConsole.JPG    | Bin 0 -> 38635 bytes
 .../homework2/SnellMulticastClient.java       |  69 +++++++++++++++++
 .../homework2/SnellMulticastServer.java       |  71 ++++++++++++++++++
 3 files changed, 140 insertions(+)
 create mode 100644 projects/Assignments/homework2/SnellConsole.JPG
 create mode 100644 projects/Assignments/homework2/SnellMulticastClient.java
 create mode 100644 projects/Assignments/homework2/SnellMulticastServer.java

diff --git a/projects/Assignments/homework2/SnellConsole.JPG b/projects/Assignments/homework2/SnellConsole.JPG
new file mode 100644
index 0000000000000000000000000000000000000000..880688e3de41e3dd8e3fdd31b65837686a8d8c8c
GIT binary patch
literal 38635
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

literal 0
HcmV?d00001

diff --git a/projects/Assignments/homework2/SnellMulticastClient.java b/projects/Assignments/homework2/SnellMulticastClient.java
new file mode 100644
index 0000000000..b6a9437f77
--- /dev/null
+++ b/projects/Assignments/homework2/SnellMulticastClient.java
@@ -0,0 +1,69 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package HW2;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+
+/**
+ *
+ * @author Justin Snell
+ */
+public class SnellMulticastClient {
+    public static final String MULTICAST_ADDRESS = "239.1.2.15";
+    public static final int DESTINATION_PORT = 1717;
+    /** How many routers can be crossed */
+    public static final int TTL = 10; 
+    
+    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(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;
+            
+            while(true)
+            {
+                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 secondNumber = dis.readInt();
+                
+                System.out.println("Number received: " + count + " xpos:" + firstNumber + " ypos:" + secondNumber);
+            }
+        }
+        catch(Exception e)
+        {
+            System.out.println(e);
+        }
+    }
+    
+}
diff --git a/projects/Assignments/homework2/SnellMulticastServer.java b/projects/Assignments/homework2/SnellMulticastServer.java
new file mode 100644
index 0000000000..1d07ef5a73
--- /dev/null
+++ b/projects/Assignments/homework2/SnellMulticastServer.java
@@ -0,0 +1,71 @@
+package HW2;
+
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.net.DatagramPacket;
+import java.net.InetAddress;
+import java.net.MulticastSocket;
+
+public class SnellMulticastServer {
+    public static final String MULTICAST_ADDRESS = "239.1.2.15";
+    public static final int DESTINATION_PORT = 1717;
+    /** How many routers can be crossed */
+    public static final int TTL = 10; 
+    
+    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
+            
+            int xpos = 12;
+            int ypos = 15;
+            
+            // 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);
+            dos.writeInt(xpos);
+            dos.writeInt(ypos);
+            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?
+            
+            for(int idx = 0; idx < 100; idx++)
+            {
+               multicastSocket.send(packet);
+               Thread.sleep(1000); // Send 100, one per second
+               System.out.println("Sent multicast packet " + idx + " of 100");
+            }
+        }
+        catch(Exception e)
+        {
+            System.out.println(e);
+        }
+    } 
+}
-- 
GitLab