Synchronisation Uhrzeit?

Hey Leute.

Ich hatte ja mal vor ein paar monaten dieses adk klon projekt, das ich jetzt wieder
mal aufgegriffen hab.

Als ich eben anfing am runden basierten spiel system zu basteln und so weiter, viel mir ein kleines
detail auf:

Wenn ich vom server aus den befehl “start” broadcaste, sprich das jeder client mal sein spiel
starten soll, hängt es ja von der unterschiedlichen ping zahl ab, ob jetzt gewisse spieler
vllt sogar vor den anderen wirklich loslegen können. Das wäre ja irgendwie ein bisschen… sinnfrei.
Daher dachte ich, schicke ich einfach starttime = System.currentTimeMillis() + 5000 vom server mit, damit die clients
dann das spiel starten sollen, wenn System.currentTimeMillis() gleich starttime ist.

Die Idee fand ich so schön, das ich komplett vergessen hat das die currentTimeMillis vom system zu system ne unterschiedliche zeit ausspucken…
wenn irgendwo die uhr verstellt ist oder sonst was.

Nun. Ich will jetzt keinen TimeServer anfragen oder so, weil das erstens ein wenig overkill wäre und zweitens
wieder unterschiedliche startzeiten je nach inet verbindung brignen würde.

Daher die Frage, fällt euch irgendetwas ein, wie man oben genanntest ermöglichen könnte?
Also gibt es irgendnen wert, der in jeder vm gleich ist und sich eben auch gleich verändert?

Vielen Dank!

http://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ntp/package-summary.html

fällt mir grad so ein

okay, mit reinem java wird es also nicht gehen?

Hm, wie benutze ich diese ntp implementierung denn genau?..

Doch natürlich. Du sendest vom Server aus die Serverzeit in einem DateTime-Objekt zu den Klienten. Server und Clienten verrechnen dieses nun mit ihrer Laufzeit, welche sie aus System.currentTimeMillis() oder System.nanoTime() entnehmen können.

[quote=Spacerat]Doch natürlich. Du sendest vom Server aus die Serverzeit in einem DateTime-Objekt zu den Klienten. Server und Clienten verrechnen dieses nun mit ihrer Laufzeit, welche sie aus System.currentTimeMillis() oder System.nanoTime() entnehmen können.[/quote]Jeder Client sollte vor den Start seine Differenz zum Server statistisch ermitteln, also aus mehreren Serverzeiten seine durchschnittliche Abweichung erreichnen. Währen der “Initialisierung” des Spiels gibt es da sicher genug Traffic. Der Server müsste also nur mit jeder Nachricht seine Zeit mitschicken…

bye
TT

Es geht hier doch um ein rundenbasiertes Spiel. Ob die Spieler nun um eine halbe Sekunde versetzt anfangen (was wahrscheinlich schon eine viel zu hoch gegriffene Latenz ist), ist dabei doch egal. Die Hauptsache ist, dass die Dauer der einzelnen Spielphasen sich nicht unterscheidet. Und das geht auch mit reiner Clientzeit.
Die Clients brauchen die Zeit auch nicht mit dem Server zu synchronisieren, wenn überall relative Zeiten verwendet werden (z. B. zum Offset “Spielstart”).

Hey Leute!

Ja, gestern bis 3 Uhr nachts programmiert, da fällt einem sowas nicht ein… heute morgen
wie ein geistesblitz schon ^^
die differenz ist hier natürlich die sinnvollste lösung… danke trozdem ^^

hm cmrudolph, so einen unterscheid macht es wohl nicht.
aber sieh es einfach so, das ich es gerne so hätte, weil das mein erstes netzwerk
projekt ist und man da solche direkt ausprobieren sollte :wink:

kommt darauf an, was man darunter versteht,
der Server sollte kaum schreiben ‚Antwort bitte bis Datum, Uhrzeit‘ und das kann bei einem beliebigen Client 3 Tage dauern :wink:
also das kann schon mächtig Ärger machen falls derart simpel gebaut

aber darauf kommt man ja eigentlich auch gar nicht,
eher eine Nachricht ‚Antwort bitte in 10 sec ab jetzt‘ und der Client merkt sich wann die Runde begann usw.?

allerdings klingt

[quote=mymaksimus;96624]Daher dachte ich, schicke ich einfach starttime = System.currentTimeMillis() + 5000 vom server mit, damit die clients
dann das spiel starten sollen, wenn System.currentTimeMillis() gleich starttime ist.[/quote]
doch nach der üblen Variante :wink: , also das ist wirklich zu reparieren,
wenn die Zeiten nur um paar sec abweichen, dann nicht schlimm, paar Minuten habe ich auf meinem Rechner aber desöfteren,
bei schlecht eingestellter Systemzeit ist auch Stunden/ Tagen ohne weiteres denkbar, dann ganz düster

Mit Clientzeit meinte ich nicht die absolute „Menschenuhrzeit“, sondern eine Zeit, die (in welcher Form auch immer) nur auf dem Client gültigkeit hat - also genau so etwas wie [japi]System#nanoTime[/japi].

Das meinte ich mit

[QUOTE=Timothy_Truckle;96629]Jeder Client sollte vor den Start seine Differenz zum Server statistisch ermitteln, also aus mehreren Serverzeiten seine durchschnittliche Abweichung erreichnen. Währen der “Initialisierung” des Spiels gibt es da sicher genug Traffic. Der Server müsste also nur mit jeder Nachricht seine Zeit mitschicken…

bye
TT[/QUOTE]Das ist korrekt. Das was ich geschrieben hatte, diente nur dem anfänglichen Uhrenvergleich, welcher für diese Art der Synchronisation notwendig ist. Analog zu cmrudolph, bleibt den Clienten ja nicht viel übrig, ausser die eigenen Takte zwischen zwei Ereignissen zu zählen und die gezählten Takte mit den Differenzen zur jeweils vom Server gesendeten Zeit zu vergleichen (inkl. Signallauf- bzw. Pong-Zeit).