commit fdba979a0fa8c0c5ccb0b4c52c699d1097646159 Author: Sebastian Rieger Date: Sun Jun 2 22:22:05 2019 +0200 initial version diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..d171cd4 --- /dev/null +++ b/.classpath @@ -0,0 +1,6 @@ + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ae3c172 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/.project b/.project new file mode 100644 index 0000000..94f2040 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + kommunikationsnetze-und-protokolle-bsc-ai-examples + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/build/Server1.jar b/build/Server1.jar new file mode 100644 index 0000000..532b0ef Binary files /dev/null and b/build/Server1.jar differ diff --git a/build/Server2.jar b/build/Server2.jar new file mode 100644 index 0000000..897097a Binary files /dev/null and b/build/Server2.jar differ diff --git a/build/TCPPerfServer.jar b/build/TCPPerfServer.jar new file mode 100644 index 0000000..c82e5b0 Binary files /dev/null and b/build/TCPPerfServer.jar differ diff --git a/build/UDPPerfServer.jar b/build/UDPPerfServer.jar new file mode 100644 index 0000000..026a746 Binary files /dev/null and b/build/UDPPerfServer.jar differ diff --git a/build/build-server-jars.xml b/build/build-server-jars.xml new file mode 100644 index 0000000..6c721cd --- /dev/null +++ b/build/build-server-jars.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/perf/TCPPerfClient.java b/src/perf/TCPPerfClient.java new file mode 100644 index 0000000..1362579 --- /dev/null +++ b/src/perf/TCPPerfClient.java @@ -0,0 +1,59 @@ +package perf; + +import java.io.BufferedReader; +import java.io.DataOutputStream; +import java.io.InputStreamReader; +import java.net.Socket; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +class TCPPerfClient { + public static void main(String argv[]) throws Exception { + String hostname = ""; + int tcpPort = 36039; + DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + + //System.out.println("Bitte geben Sie die Server-Adresse ein: "); + //hostname = inFromUser.readLine(); + hostname = "127.0.0.1"; + + while (true ) { + BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); + System.out.print("Bitte geben Sie die Anzahl zu übertragender Megabytes ein: "); + Long number = new Long(inFromUser.readLine()); + //Long number = (long)1; + + Socket clientSocket = new Socket(hostname, tcpPort); + + DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); + BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + + long timestampStart = System.currentTimeMillis(); + System.out.println("Zeit vor Versand = " + timestampStart + " ms, " + df.format(new Date(timestampStart))); + outToServer.writeBytes(number.toString() + "\n"); + + if (number == 0) { + break; + } + + char[] buffer = new char[1024 * 1024]; + long totalBytesReceived = 0; + int charsRead = inFromServer.read(buffer); + while (charsRead != -1) + { + totalBytesReceived += charsRead; + charsRead = inFromServer.read(buffer); + } + + long timestampEnd = System.currentTimeMillis(); + System.out.println("Zeit nach Empfang = " + timestampEnd + " ms, " + df.format(new Date(timestampEnd))); + long duration = timestampEnd - timestampStart; + System.out.println("Delay = " + duration + " ms"); + double seconds = (duration / 1000.0); + double throughput = (totalBytesReceived / seconds); + System.out.println("Rate = " + (long)throughput + " B/s"); + clientSocket.close(); + } + } +} diff --git a/src/perf/TCPPerfServer.java b/src/perf/TCPPerfServer.java new file mode 100644 index 0000000..afc1dd8 --- /dev/null +++ b/src/perf/TCPPerfServer.java @@ -0,0 +1,55 @@ +package perf; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.ServerSocket; +import java.net.Socket; + +class TCPPerfServer { + public static void main(String argv[]) throws Exception { + int tcpPort = 36039; + Long clientNumberOfMegabytes; + + ServerSocket serverSocket = new ServerSocket(tcpPort); + + System.out.println("TCPPerfServer gestartet. Warte auf eingehende Requests..."); + + while (true) { + Socket connectionSocket = serverSocket.accept(); + + BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); + BufferedWriter outToClient = new BufferedWriter(new OutputStreamWriter(connectionSocket.getOutputStream())); + + char[] buffer = new char[1024]; + clientNumberOfMegabytes = new Long(inFromClient.readLine()); + + if (clientNumberOfMegabytes == 0) { + connectionSocket.close(); + break; + } + + System.out.println("Request von TCPPerfClient " + connectionSocket.getInetAddress() + ":" + connectionSocket.getPort() + " empfangen. Erzeuge und sende " + clientNumberOfMegabytes + "MB ..."); + + for (long mb = 0; mb < clientNumberOfMegabytes; mb++) { + long megabyteStartTimeMilli = System.currentTimeMillis(); + for (long segment = 1; segment < 1024; segment++) { + long segmentStartTimeNano = System.nanoTime(); + outToClient.write(buffer); + if (clientNumberOfMegabytes == 1) { + double transferDurationSegment = System.nanoTime() - segmentStartTimeNano; + //System.out.printf("Dauer pro Segment: %.0f ns, Rate: %.0f KByte/s (MB: %d, Segment: %d)\n", transferDurationSegment, (1024 / (transferDurationSegment / 1000000000)), mb, segment); + // CSV Output Excel + System.out.println(mb + "," + segment + "," + transferDurationSegment); + } + } + double transferDurationMB = System.currentTimeMillis() - megabyteStartTimeMilli; + System.out.printf("1 MB (genauer MiB) gesendet in: %.0f ms, Rate: %.0f Bytes/s (MB: %d)\n", transferDurationMB, ((1024 * 1024) / (transferDurationMB / 1000)), mb); + } + System.out.print("\n"); + connectionSocket.close(); + } + serverSocket.close(); + } +} diff --git a/src/perf/UDPPerfClient.java b/src/perf/UDPPerfClient.java new file mode 100644 index 0000000..11e5500 --- /dev/null +++ b/src/perf/UDPPerfClient.java @@ -0,0 +1,70 @@ +package perf; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; +import java.net.SocketTimeoutException; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +class UDPPerfClient { + public static void main(String argv[]) throws Exception { + String hostname = ""; + int udpPort = 36039; + DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); + + //System.out.println("Bitte geben Sie die Server-Adresse ein: "); + //hostname = inFromUser.readLine(); + hostname = "127.0.0.1"; + InetAddress serverAddress = InetAddress.getByName(hostname); + + while (true) { + BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); + System.out.print("Bitte geben Sie die Anzahl zu übertragender Megabytes ein: "); + Long numberOfMegabytes = new Long(inFromUser.readLine()); + //Long number = (long)1; + + DatagramSocket clientSocket = new DatagramSocket(); + clientSocket.setSoTimeout(5000); + + long timestampStart = System.currentTimeMillis(); + System.out.println("Zeit vor Versand = " + timestampStart + " ms, " + df.format(new Date(timestampStart))); + byte[] outbuffer = (new String(numberOfMegabytes + "\n")).getBytes(); + DatagramPacket sendPacket = new DatagramPacket(outbuffer, outbuffer.length, serverAddress, udpPort); + clientSocket.send(sendPacket); + + if (numberOfMegabytes == 0) { + break; + } + + long totalBytesReceived = 0; + while (true) { + byte[] receiveData = new byte[1024]; + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); + try { + clientSocket.receive(receivePacket); + } catch (SocketTimeoutException ste) { + System.out.println("Timeout"); + break; + } + + String receivedString = new String(receiveData); + if (receivedString.contains("done")) { + System.out.println("Ende der Übermittlung erkannt."); + break; + } + else + { + totalBytesReceived += receivePacket.getLength(); + System.out.println(totalBytesReceived + " Bytes insgesamt empfangen."); + } + + } + System.out.printf("Insgesamt %d Bytes von %d (%d MB) empfangen.\n", totalBytesReceived - 4, (1024 * 1024) * numberOfMegabytes, numberOfMegabytes); + clientSocket.close(); + } + } +} diff --git a/src/perf/UDPPerfServer.java b/src/perf/UDPPerfServer.java new file mode 100644 index 0000000..d5dc91f --- /dev/null +++ b/src/perf/UDPPerfServer.java @@ -0,0 +1,58 @@ +package perf; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.InputStreamReader; +import java.net.DatagramPacket; +import java.net.DatagramSocket; +import java.net.InetAddress; + +class UDPPerfServer { + public static void main(String argv[]) throws Exception { + int udpPort = 36039; + Long clientNumberOfMegabytes; + + DatagramSocket datagramSocket = new DatagramSocket(udpPort); + + byte[] receiveData = new byte[1024]; + byte[] sendData = new byte[1024]; + + System.out.println("UDPPerfServer gestartet. Warte auf eingehende Requests..."); + + while (true) { + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); + datagramSocket.receive(receivePacket); + + InetAddress clientAddress = receivePacket.getAddress(); + int clientSrcPort = receivePacket.getPort(); + + BufferedReader inFromClient = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(receivePacket.getData()))); + + clientNumberOfMegabytes = new Long(inFromClient.readLine()); + + if (clientNumberOfMegabytes == 0) { + break; + } + + for (long mb = 0; mb < clientNumberOfMegabytes; mb++) { + long megabyteStartTimeMilli = System.currentTimeMillis(); + for (long segment = 1; segment < 1024; segment++) { + //long segmentStartTimeNano = System.nanoTime(); + DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientSrcPort); + datagramSocket.send(sendPacket); + //double transferDurationSegment = System.nanoTime() - segmentStartTimeNano; + //System.out.printf("Dauer pro Segment: %.0f ns, Rate: %.0f KByte/s (MB: %d, Segment: %d)\n", transferDurationSegment, (1024 / (transferDurationSegment / 1000000000)), mb, segment); + // CSV Output Excel + //System.out.println(mb + "," + segment + "," + transferDurationSegment); + } + double transferDurationMB = System.currentTimeMillis() - megabyteStartTimeMilli; + System.out.printf("1 MB (genauer MiB) gesendet in: %.0f ms, Rate: %.0f Bytes/s (MB: %d)\n", transferDurationMB, ((1024 * 1024) / (transferDurationMB / 1000)), mb); + } + System.out.print("\n"); + byte[] finishLabel = (new String("done")).getBytes(); + DatagramPacket sendPacket = new DatagramPacket(finishLabel, finishLabel.length, clientAddress, clientSrcPort); + datagramSocket.send(sendPacket); + } + datagramSocket.close(); + } +} diff --git a/src/socket/Client1.java b/src/socket/Client1.java new file mode 100644 index 0000000..c5ca1cd --- /dev/null +++ b/src/socket/Client1.java @@ -0,0 +1,43 @@ +/* Angelehnt an Kurose/Ross Computernetzwerke (bis 5e Java, ab 6e Python) */ + +package socket; + +import java.io.*; +import java.net.*; + +class Client1 { + public static void main(String args[]) throws Exception { + String hostname = "localhost"; + int port = 36037; + + BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); + DatagramSocket clientSocket = new DatagramSocket(); + + InetAddress serverAddress = InetAddress.getByName(hostname); + byte[] sendData = new byte[1024]; + byte[] receiveData = new byte[1024]; + String message; + String modifiedMessage; + + while (true) + { + System.out.print("Nachricht an Server1: "); + message = inFromUser.readLine(); + + sendData = message.getBytes(); + DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, port); + clientSocket.send(sendPacket); + + if (message.equals("exit")) { + break; + } + + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); + clientSocket.receive(receivePacket); + + modifiedMessage = new String(receivePacket.getData()); + System.out.println("Antwort von Server1: " + modifiedMessage); + } + clientSocket.close(); + } +} diff --git a/src/socket/Client2.java b/src/socket/Client2.java new file mode 100644 index 0000000..e208054 --- /dev/null +++ b/src/socket/Client2.java @@ -0,0 +1,37 @@ +/* Angelehnt an Kurose/Ross Computernetzwerke (bis 5e Java, ab 6e Python) */ + +package socket; + +import java.io.*; +import java.net.*; + +class Client2 { + public static void main(String argv[]) throws Exception { + String hostname = "localhost"; + int port = 36037; + + BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in)); + Socket clientSocket = new Socket(hostname, port); + + DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream()); + BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); + String message; + String modifiedMessage; + + while (true) + { + System.out.print("Nachricht an Server2: "); + message = inFromUser.readLine(); + + outToServer.writeBytes(message + '\n'); + + if (message.equals("exit")) { + break; + } + + modifiedMessage = inFromServer.readLine(); + System.out.println("Antwort von Server2: " + modifiedMessage); + } + clientSocket.close(); + } +} diff --git a/src/socket/Server1.java b/src/socket/Server1.java new file mode 100644 index 0000000..3571df5 --- /dev/null +++ b/src/socket/Server1.java @@ -0,0 +1,42 @@ +/* Angelehnt an Kurose/Ross Computernetzwerke (bis 5e Java, ab 6e Python) */ + +package socket; + +import java.net.*; + +class Server1 { + public static void main(String args[]) throws Exception { + int port = 36037; + + DatagramSocket serverSocket = new DatagramSocket(port); + + byte[] receiveData = new byte[1024]; + byte[] sendData = new byte[1024]; + String message; + String modifiedMessage; + + System.out.println("Server1 gestartet. Warte auf eingehende Requests..."); + + while (true) { + DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); + serverSocket.receive(receivePacket); + message = new String(receivePacket.getData(), 0, receivePacket.getLength()); + + InetAddress clientAddress = receivePacket.getAddress(); + int clientSrcPort = receivePacket.getPort(); + + System.out.println("Request von Client1 " + clientAddress + ":" + clientSrcPort + " empfangen. Erzeuge und sende Antwort..."); + + if (message.equals("exit")) + { + break; + } + + modifiedMessage = message.toUpperCase(); + sendData = modifiedMessage.getBytes(); + DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientSrcPort); + serverSocket.send(sendPacket); + } + serverSocket.close(); + } +} diff --git a/src/socket/Server2.java b/src/socket/Server2.java new file mode 100644 index 0000000..3fd7c75 --- /dev/null +++ b/src/socket/Server2.java @@ -0,0 +1,45 @@ +/* Angelehnt an Kurose/Ross Computernetzwerke (bis 5e Java, ab 6e Python) */ + +package socket; + +import java.io.*; +import java.net.*; + +class Server2 { + public static void main(String argv[]) throws Exception { + int port = 36037; + + ServerSocket serverSocket = new ServerSocket(port); + + String message; + String modifiedMessage; + + System.out.println("Server2 gestartet. Warte auf eingehende Requests..."); + + Socket connectionSocket = serverSocket.accept(); + while (true) { + + BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); + DataOutputStream outToClient = new DataOutputStream(connectionSocket.getOutputStream()); + + // Try/Catch hinzugefügt, nachdem bei Einsatz mit Amazon AWS (Healthcheck des ELB) message null war + try { + message = inFromClient.readLine(); + if (message != null) { + System.out.println("Request von Client2 " + connectionSocket.getInetAddress() + ":" + connectionSocket.getPort() + " empfangen. Erzeuge und sende Antwort..."); + + if (message.equals("exit")) { + break; + } + + modifiedMessage = message.toUpperCase() + '\n'; + outToClient.writeBytes(modifiedMessage); + } + } catch (IOException ioe) { + ioe.printStackTrace(); + } + } + connectionSocket.close(); + serverSocket.close(); + } +}