Skip to content
Snippets Groups Projects
Commit 0a0553a4 authored by bweissenbergergy's avatar bweissenbergergy
Browse files

Initial Commit of Homework #3

08/17/2020
parent b0390be4
No related branches found
No related tags found
No related merge requests found
...@@ -10,3 +10,10 @@ References include ...@@ -10,3 +10,10 @@ References include
* [assignments source subdirectories](../../../../../assignments/src) show examples from previous cohorts. * [assignments source subdirectories](../../../../../assignments/src) show examples from previous cohorts.
Questions and innovation are always welcome, good luck! Questions and innovation are always welcome, good luck!
This program(s) do(es) the following:
- send two numbers, a mathematical operator and a port number over VPN to a TCP receiver
- the TCP receiver calculates the result and send it back to the sender over VPN using UDP!
- the UDP receiver shows the result
package MV3500Cohort2020JulySeptember.homework3.Weissenberger;
import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/**
* This class will be connected by an TCP sender over VPN (argon), calculating
* a result of an equation and send the result back via UDP over VPN.
* @date 08/17/2020
* @author Loki
* @group Weissenberger/Goericke
*/
public class TCPNumberReceiver {
// Change this to the port where the TCP server is listening
private static final int TCP_ARGON_SERVER_PORT = 2317;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
// ServerSocket waits for a connection from a client.
System.out.println("TCPNumberReceiver has started...");
ServerSocket serverSocket = new ServerSocket(TCP_ARGON_SERVER_PORT);
InetAddress remoteAddress;
InputStream inputStream;
InputStreamReader inputStreamReader;
BufferedReader bufferedReader;
String clientMessage;
int number1, number2;
String calculation_Method;
int iUDPResultReceivingPort;
// Server is up and waiting (i.e. "blocked" or paused)
// Loop, infinitely, waiting for client connections.
// Stop the program somewhere else.
while (true) {
// block until connected to a client
try (Socket clientConnectionSocket = serverSocket.accept())
{
// Now hook everything up (i.e. set up the streams), Java style:
inputStream = clientConnectionSocket.getInputStream();
inputStreamReader = new InputStreamReader(inputStream);
bufferedReader = new BufferedReader(inputStreamReader);
clientMessage = bufferedReader.readLine();
number1 = Integer.parseInt(bufferedReader.readLine());
number2 = Integer.parseInt(bufferedReader.readLine());
calculation_Method = bufferedReader.readLine();
iUDPResultReceivingPort = Integer.parseInt(bufferedReader.readLine());
System.out.println("Message recived: "+clientMessage);
System.out.println("Number 1 recived: "+number1);
System.out.println("Number 2 recived: "+number2);
System.out.println("Calc Method recived: "+calculation_Method);
System.out.println("Send result to port: "+iUDPResultReceivingPort);
// This includes the port and IP numbers on both sides (the socket pair).
remoteAddress = clientConnectionSocket.getInetAddress();
System.out.println("Send result to IP: "+remoteAddress.getHostAddress());
// try to send the calculated result as a float via UDP...
sendResultViaUDP(calculateResult(number1, number2, calculation_Method), remoteAddress, iUDPResultReceivingPort);
}
}
} catch (IOException e) {
System.err.println("Problem with TcpExample3Server networking: " + e);
// Provide more helpful information to user if exception occurs due to running twice at one time
if (e instanceof java.net.BindException) {
System.err.println("*** Be sure to stop any other running instances of programs using this port!");
}
}
}
private static void sendResultViaUDP(float result, InetAddress inetAddress, int port) throws IOException{
DatagramSocket udpSocket = null;
DataOutputStream dos = null;
try
{
// Create a UDP socket
udpSocket = new DatagramSocket(); // let system assign output port, then SENDING_PORT not needed
// 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(1500); // how many bytes are in buffer? MTU=1500 is good
dos = new DataOutputStream(baos); // wrapper for writing values, connects both streams
// Put together a packet to send
// these types and order of variables must match on sender and receiver
byte[] byteArray = baos.toByteArray();
DatagramPacket datagramPacket = new DatagramPacket(byteArray, byteArray.length, inetAddress, port);
for (int index = 1; index <= 10; index++)
{
dos.writeFloat (result);
dos.flush(); // sends DataOutputStream to ByteArrayOutputStream
byteArray = baos.toByteArray(); // OK so go get the flushed result...
datagramPacket.setData(byteArray); // and put it in the packet...
udpSocket.send(datagramPacket); // and send it away. boom gone, nonblocking.
Thread.sleep(1000); // Send packets at rate of one per second
baos.reset(); // clear the output stream after sending
}
dos.close();
}
catch (IOException | InterruptedException e)
{
System.err.println("Problem with UdpSender, see exception trace:");
System.err.println(e);
}
finally // clean up prior to exit, don't want to leave behind zombies
{
if (udpSocket != null)
udpSocket.close();
if (dos != null)
dos.close();
}
}
/**
* calculates the result based on given numbers and operator
* @param n1 first number
* @param n2 second number
* @param operator
* @return the result as a float
*/
private static float calculateResult(int n1, int n2, String operator){
float result = -1;
switch (operator) {
case "+":
result = n1 + n2;
break;
case "-":
result = n1 - n2;
break;
case "*":
result = n1 * n2;
break;
case "/":
result = n1 / n2;
break;
default:
System.err.println(operator +" is not a valid operator!");
break;
}
return result;
}
}
package MV3500Cohort2020JulySeptember.homework3.Weissenberger;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
/**
* This class will connect to an TCP receiver over VPN (argon) and send
* two numbers
* @date 08/17/2020
* @author Loki
* @group Weissenberger/Goericke
*/
public class TCPNumberSender {
// Change this to the IP address of the TCP server 10.1.105.9 (127.0.0.1 just for testing)
private static final String TCP_ARGON_SERVER_IP = "127.0.0.1";
// Change this to the port where the TCP server is listening
private static final int TCP_ARGON_SERVER_PORT = 2317;
// Where the result should be posted (port)
private static final int UDP_ARGON_RECEIVING_PORT = 1415;
private static final int NUMBER1 = 16;
private static final int NUMBER2 = 2;
private static final String CALCULATION_METHOD = "-";
// how many times should the number being sent
private static final int REPETITION = 1;
private static int counter = 0;
public static void main(String[] args) throws InterruptedException {
// Local variables
Socket socket;
OutputStream outputStream;
PrintStream printStream;
try {
while (counter < REPETITION){
// increment the counter
counter++;
System.out.println("Homwork 3: TcpNumberSender creating socket over VPN...");
// We request an IP to connect to "TCP_ARGON_SERVER_IP" over
// the argon VPN and port number at that IP "TCP_ARGON_SERVER_PORT".
// This establishes a connection to that IP in the form of a Socket
// object.
socket = new Socket(TCP_ARGON_SERVER_IP, TCP_ARGON_SERVER_PORT); // locohost?
// instanciate the streams:
outputStream = socket.getOutputStream();
printStream = new PrintStream(outputStream);
// send a first text to server
printStream.println("This is message from client.");
printStream.flush();
// wait 1 second
Thread.sleep(1000);
// sending number 1
printStream.println(NUMBER1);
// sending number 2
printStream.println(NUMBER2);
// sending calc method
printStream.println(CALCULATION_METHOD);
// sending the port where the result should be send to
printStream.println(UDP_ARGON_RECEIVING_PORT);
printStream.flush();
// wait 1 second
Thread.sleep(1000);
System.out.println("==================================================");
System.out.println(NUMBER1+" and "+NUMBER2+" were sent to server. Calculating method was: "+CALCULATION_METHOD);
// close TCP socket to server
socket.close();
} // end while(true)
}
catch (IOException e)
{
System.err.println("Problem with TCPNumberSender networking:");
System.err.println("Error: " + e);
if (e instanceof java.net.BindException) {
System.err.println("*** Be sure to stop any other running instances of programs using this port: "+TCP_ARGON_SERVER_PORT);
}
}
finally // occurs after any other activity when shutting down
{
System.out.println();
System.out.println("TCPNumberSender exit");
}
}
}
package MV3500Cohort2020JulySeptember.homework3.Weissenberger;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
/**
* This class will be connected by an UDP sender over VPN (argon)
* @date 08/17/2020
* @author Loki
* @group Weissenberger/Goericke
*/
public class UDPResultReceiver {
public static final int RECEIVING_PORT = 1415;
/**
* @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(UDPResultReceiver.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);
float result;
// You need a new receiving packet to read from every packet received
while (true)
{
udpSocket.receive(receivePacket); // blocks until packet is received
result = dis.readFloat();
dis.reset(); // now clear the input stream after reading, in preparation for next loop
System.out.println("Calculated result: "+result);
}
}
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(UDPResultReceiver.class.getName() + " complete."); // all done
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment