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.

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