Zeit in Client/Server-Anwendung.

Kai008

Erfahrenes Mitglied
Hi, ich habe gerade ein kleines Server bzw. ein Client-Programm geschrieben. Der Server startet nen Thread der immer in einer Endlosschleife auf Verbindungen wartet, wenn eine zustande kommt startet wartet einen weiteren neuen Thread der auf eingehende Daten des jeweiligen Clientes wartet und diese dann auswertet. Der Client ist noch nicht so schön aufgebaut, aber kann wenigstens schon Daten zum Server schicken die dieser dann auswertet.
Aber egal, darum gehts nicht.
Gehen wir mal von einen Spiel wie Diablo II aus. Oder meinetwegen auch von einen MMORPG wie WoW oder auch irgend nen Shooter. Ist ja grundsätzlich immer das selbe. Sagen wir mal der Server sendet eine Nachricht wie "Auf Koordinaten x/y wird ein Gegner vom Typ z in 100 ms gespawnt, der jetzige Timestamp ist...". Würde ich natürlich nicht so machen sondern "Spielereigniss;X;Y;Z;100;1214760858015".
Der Client würde dann vermutlich per Split alles in ein Array hauen, je nach Spielereigniss/Array[0] eine andere void laden und dort die restlichen Daten des Arrays auswerten. Dann vergleichen die Clients den momentanen ms-Timestamp, ziehen den übertragenen ab, dann hat er wie lange die Übertragung gedauert hat, und dann wieder von 100 abziehen. So lange sleept er dann und erstellt dann nen neuen Gegner oder so. Nur jetzt gibt es ein Problem. Sagen wir die RTC eines Clientes läuft 1 Sekunde falsch. Dann würde der Gegner schon um 1000 ms. falsch gespawnt werden was im Laufe der Zeit das Spiel komplett durcheinanderbringen würde. Ich dachte mir dass vielleicht der Server seine Zeit den Usern mitteilen könnte und diese dann im Clienten weiterzählen. Nur würde das die Zeit wieder durch die Übertragungswege verfälschen, außerdem weiß man ja nicht wie ausgelastet der Server ist, was wieder ausbremsen könnte.
Als nächstes kam mir die Idee ein Programm wie "Atomzeit" zu starten wenn der Client startet, aber will die Uhr der Clienten nicht einfach ändern, außerdem wäre das noch relativ ungenau.
Gibt es da eventuell eine einfache Möglichkeit das zu lösen?
 
Wenn Ich dich richtig verstehe geht es Dir um eine Synchronisation zwischen dem Server und den "Client-Kisten".
Deine Idee dass der Server seine Zeit überträgt ist gar nicht so falsch, glaube ich. Du muss halt anstelle eines new Date() für die abfrage der aktuellen Zeit den gespeicherten long verwenden, wenn Du di eClient-urh nicht durcheinanderbringen magst :-)

Ich kann mir vorstellen, dass unterschiedlich schnelle Computeruhren vernachlässgibar sind, andererseits könnte man ja regelmäßig nachsynchfonisieren, z.b. alle 5 minuten.
Eine andere Variante könnte es ja sein, di eInternetzeit (müsste doch eigetnlich geben) für die Synchronisation von Server und Clients zu verwenden.
 
new Date() kenne ich nicht, verwende immer System.currentTime.
Die Zeit übertragen bringt soweit ich denke nichts, da ja dann noch die Übertragungszeit dazukommt, wenn die Uhr nicht vom Anfang an per (Milli?)Sekunde gleich gestellt sind, und in dem Fall würde es nichts bringen. Und die Uhr (intern) angleichen gibt wegen der Übertragunszeit von 30 - 50 ms Server/Client und Client/Client falls es mal dazu kommen sollte von bis zu 200 ms auch nichts, da er ja auch nicht messen kann wie lange die Übertragung gedauert hat wenn er nicht den richtigen Timestamp rausbekommt. :/
 
Zurück