You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

92 lines
3.8 KiB

  1. package verteiltesysteme.aws;
  2. import java.io.BufferedReader;
  3. import java.io.DataOutputStream;
  4. import java.io.InputStreamReader;
  5. import java.net.Socket;
  6. import java.text.DateFormat;
  7. import java.text.SimpleDateFormat;
  8. import java.util.Date;
  9. class TCPTimeCounterClient {
  10. /**
  11. * Gibt einen Zeitstempel (timestamp) formatiert auf der Konsole aus. Der
  12. * Zeitstempel wird in aktuellen Millisekunden seit 1.1.1970 (UTC) und als
  13. * formatiertes Datum inkl. Uhrzeit ausgegeben. Der Ausgabe wird der bergebene
  14. * String outputPrefix vorangestellt.
  15. *
  16. * @param outputPrefix
  17. * String der als Beschreibung des Zeitpunkts vor die Ausgabe des
  18. * timestamp gestellt wird.
  19. * @param timestamp
  20. * Zeitstempel basierend auf System.currentTimeMillis()
  21. */
  22. private static void printFormattedTimestamp(String outputPrefix, long timestamp) {
  23. DateFormat df = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
  24. System.out.println(outputPrefix + " = " + timestamp + " ms, " + df.format(new Date(timestamp)));
  25. }
  26. public static void main(String args[]) throws Exception {
  27. String hostname = "cloudcomp-loadbalancer-1492513132.eu-central-1.elb.amazonaws.com";
  28. //String hostname = "52.68.46.135";
  29. //String hostname = "";
  30. int tcpPort = 36038;
  31. //BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
  32. long timestampStart, timestampSent, timestampEnd, delay;
  33. // Hostname vom Benutzer anfragen auf dem der Server l�uft
  34. //System.out.println("Bitte geben Sie die Server-Adresse ein: ");
  35. //hostname = inFromUser.readLine();
  36. // Socket erzeugen
  37. Socket clientSocket = new Socket(hostname, tcpPort);
  38. // Zahl vom Benutzer abfragen, die dann vom Server auf den aktuellen Z�hlerstand
  39. // addiert wird
  40. System.out.println("Bitte geben Sie eine Zahl ein: ");
  41. //Long number = new Long(inFromUser.readLine());
  42. Long number = new Long(10);
  43. // Zahl an Server senden
  44. System.out.println(System.lineSeparator());
  45. timestampStart = System.currentTimeMillis();
  46. printFormattedTimestamp("Zeit vor Versand", timestampStart);
  47. DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
  48. BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  49. outToServer.writeBytes(number.toString() + '\n');
  50. timestampSent = System.currentTimeMillis();
  51. printFormattedTimestamp("Zeit nach Versand", timestampSent);
  52. // Antwort mit neuem Z�hlerstand und Timestamp vom Server empfangen
  53. String result = inFromServer.readLine();
  54. timestampEnd = System.currentTimeMillis();
  55. printFormattedTimestamp("Zeit nach Empfang", timestampEnd);
  56. // Delay als Zeit zwischen timestampSent und timestampEnd berechnen und
  57. // ausgeben
  58. delay = timestampEnd - timestampStart;
  59. System.out.println("�bertragungsdauer = " + delay + " ms");
  60. System.out.println(System.lineSeparator());
  61. // Antwort vom Server auswerten und ausgeben
  62. System.out.println("Ausgabe vom Server:" + System.lineSeparator() + result);
  63. // Vom Server �bergebenen Zeitstempel aus der Antwort herausschneiden
  64. //
  65. // Format Ausgabe vom Server "<Z�hlerstand> Zeit: <Zeitstempel> <Datum/Uhrzeit>"
  66. // Beispiel: 60 Zeit: 1510735274021 15.11.2017 08:41:14
  67. long timestampServer = new Long(result.split(" ")[2]).longValue();
  68. // One-Way-Delay (Bitverz�gerung) aus Rount-Trip-Time (RTT) ermitteln
  69. float oneWayDelayEstimate = (timestampEnd - timestampSent) / 2;
  70. // Zeitabweichung zwischen Client und Server ermitteln (Zeitstempel vom Server
  71. // minus Zeitstempel bei Versand am Client minus One-Way-Delay)
  72. float timestampSkew = timestampServer - timestampSent - oneWayDelayEstimate;
  73. System.out.println("Zeitversatz zwischen Server und Client ca. = " + timestampSkew + " ms");
  74. System.out.println(System.lineSeparator());
  75. // Socket schlie�en
  76. clientSocket.close();
  77. }
  78. }