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.

91 lines
3.7 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 = "VertSys-ELB1-b88aad9416b2929b.elb.eu-central-1.amazonaws.com";
  28. //String hostname = "";
  29. int tcpPort = 36038;
  30. //BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
  31. long timestampStart, timestampSent, timestampEnd, delay;
  32. // Hostname vom Benutzer anfragen auf dem der Server l�uft
  33. //System.out.println("Bitte geben Sie die Server-Adresse ein: ");
  34. //hostname = inFromUser.readLine();
  35. // Socket erzeugen
  36. Socket clientSocket = new Socket(hostname, tcpPort);
  37. // Zahl vom Benutzer abfragen, die dann vom Server auf den aktuellen Z�hlerstand
  38. // addiert wird
  39. System.out.println("Bitte geben Sie eine Zahl ein: ");
  40. //Long number = new Long(inFromUser.readLine());
  41. Long number = new Long(10);
  42. // Zahl an Server senden
  43. System.out.println(System.lineSeparator());
  44. timestampStart = System.currentTimeMillis();
  45. printFormattedTimestamp("Zeit vor Versand", timestampStart);
  46. DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream());
  47. BufferedReader inFromServer = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
  48. outToServer.writeBytes(number.toString() + '\n');
  49. timestampSent = System.currentTimeMillis();
  50. printFormattedTimestamp("Zeit nach Versand", timestampSent);
  51. // Antwort mit neuem Z�hlerstand und Timestamp vom Server empfangen
  52. String result = inFromServer.readLine();
  53. timestampEnd = System.currentTimeMillis();
  54. printFormattedTimestamp("Zeit nach Empfang", timestampEnd);
  55. // Delay als Zeit zwischen timestampSent und timestampEnd berechnen und
  56. // ausgeben
  57. delay = timestampEnd - timestampStart;
  58. System.out.println("�bertragungsdauer = " + delay + " ms");
  59. System.out.println(System.lineSeparator());
  60. // Antwort vom Server auswerten und ausgeben
  61. System.out.println("Ausgabe vom Server:" + System.lineSeparator() + result);
  62. // Vom Server �bergebenen Zeitstempel aus der Antwort herausschneiden
  63. //
  64. // Format Ausgabe vom Server "<Z�hlerstand> Zeit: <Zeitstempel> <Datum/Uhrzeit>"
  65. // Beispiel: 60 Zeit: 1510735274021 15.11.2017 08:41:14
  66. long timestampServer = new Long(result.split(" ")[2]).longValue();
  67. // One-Way-Delay (Bitverz�gerung) aus Rount-Trip-Time (RTT) ermitteln
  68. float oneWayDelayEstimate = (timestampEnd - timestampSent) / 2;
  69. // Zeitabweichung zwischen Client und Server ermitteln (Zeitstempel vom Server
  70. // minus Zeitstempel bei Versand am Client minus One-Way-Delay)
  71. float timestampSkew = timestampServer - timestampSent - oneWayDelayEstimate;
  72. System.out.println("Zeitversatz zwischen Server und Client ca. = " + timestampSkew + " ms");
  73. System.out.println(System.lineSeparator());
  74. // Socket schlie�en
  75. clientSocket.close();
  76. }
  77. }