Wie sendet ein Timeserver? Codebeispiel

R

ratata

Gast
Hallo,

ich verwende dieses Zeitholprogramm von Java-Netzwerkfunktionen.

Java:
import java.io.IOException;
import java.io.InputStream;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;

public class TimeFromInternet
{
   public static void main( String[] args )
   {
      final String           DEFAULT_TIME_SERVER = "ptbtime1.ptb.de";
      final SimpleDateFormat DATUMFORMAT = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
      final long             SEKUNDEN_1900_1970 = 2208988800L;
      Socket                 so = null;
      InputStream            in = null;
      long                   time = 0;
      try {
         so = new Socket( ( args.length > 0 ) ? args[0] : DEFAULT_TIME_SERVER, 37 );
         in = so.getInputStream();
         for( int i = 3; i >= 0; i-- ) {
            time ^= (long) in.read() << i * 8;
         }
         // Der Time Server gibt die Sekunden seit 1900 aus, Java erwartet Millisekunden seit 1970:
         System.out.println( DATUMFORMAT.format( new Date( (time - SEKUNDEN_1900_1970) * 1000 ) ) );
      } catch( Exception ex ) {
         System.out.println( ex );
      } finally {
         if( in != null ) try { in.close(); } catch( IOException ex ) {/*ok*/}
         if( so != null ) try { so.close(); } catch( IOException ex ) {/*ok*/}
      }
   }
}

Aber wie sieht dann der Server aus? Sendet er zyklisch die Zeit? Macht er auch ein Socket aus?
Hat da jemand ein Beispiel? Weil an Beispielen erkenn ich den Zusammenhang besser, als wenns jmd mit Worten erklärt...
 
N

nillehammer

Gast
Timeserver verwenden üblicherweise das ntp-Protokoll. Sie horchen auf dem UDP-Port 123 auf Anfragen von Clients. Infos dazu gibt es auf ntp.org: Home of the Network Time Protocol

Auch der Server ptbtime1.ptb.de ist ein solcher Server. Insofern wundert mich der von Dir kopierte Code etwas. Hier wird eine TCP-Verbindung auf Port 37 aufgemacht, was für mich nach zwei Mal falsch aussieht.

[EDIT]
Ok, habe jetzt nochmal kurz recherchiert. TCP-Port 37 ist das sog. Time-Protocol. Insofern passt der Code doch. Auch hier ist es so, dass der Server einfach nur auf Anfragen wartet. Das Time-Protocol ist aber schon lange durch ntp abgelöst. Insofern ist es vielleicht besser, sich mit ntp zu befassen.
[/EDIT]
 
Zuletzt bearbeitet von einem Moderator:
G

Gast2

Gast
Aber wie sieht dann der Server aus? Sendet er zyklisch die Zeit? Macht er auch ein Socket aus?
Nein, der Server wartet einfach nur bis sich mal irgendwann ein Client meldet und sendet dem dann die aktuelle Zeit. Danach wartet er wieder weiter.

Um mal in Java zu bleiben:
Der Server macht einen ServerSocket auf, der auf Port 37 lauscht. Meldet sich ein Client erstellt der Server einen Socket der die Kommunikation mit dem Client handelt. Hier wird dann vermutlich nur die Zeit gesendet und die Verbindung wird wieder getrennt.
 
R

ratata

Gast
Und wie sieht das aus? Beschreibt er einfach ständig einen Outputstream?
Und wie sendet er es, dass es immer alle empfangen können?
Weil das ist ja keine feste TCP-verbindung, oder?

Wie sieht ein JavaProgramm aus?
 

sn1x

Mitglied
Google doch einfach mal "Client/Server Java".

Der Server hat ein ServerSocket (wie bereits oben erwähnt).
Dieser wartet ständig auf Client-Anfragen. Dazu wird immer ein eigener Thread erstellt, damit mehrere Clients gleichzeitig versorgt werden können.

Wurde eine Anfrage gestellt, bekommt man den inputStream des Sockets (client) und antwortet darauf mit dem outputStream. Der Zeitserver schliesst vermutlich danach sofort wieder den Socket.

WIe konkret "dein" Zeitserver das macht, weiß ich nicht. Bin von dem UDP bisschen verwirrt.
Der ServerSocket arbeitet aufjedenfall mit TCP.
 
R

ratata

Gast
Wenn wir schon bei den Protokollen sind: Was ist denn der Unterschied zwischen SNTP und dem TIME Protokoll?
Ich habe gelesen, dass SNTP auf UDP/TIME Protokoll aufsetzt? Was heißt das genau? Stimmt das überhaupt so?
Wo sind die Unterschiede zwischen SNTP und TIME?
 

Ähnliche Java Themen


Oben