Cześć,
po raz kolejny próbuje napisać aplikację do grania w szachy przez internet. Porzuciłem pisanie tego w Delphi i zacząłem uczyć się pythona (backend) i javascript (front).
Idzie całkiem nieźle ale trafiłem na przeszkodę związaną z synchronizacją czasu między klientem i serwerem.
Na początku synchronizacja czasu polegała na tym, że:
- Serwer odpala czas i wysyła informację do klienta,
- Klient aktualizuje swój czas na ten serwera,
- Wykonuje ruch i odsyła informacje do serwera,
- Serwer wykonuje swoje obliczenia, zatrzymuje czas i odsyła informacje o czasie do klienta.
- Klient aktualizuje swój czas na ten serwera.
Niby wszystko gra ale czytałem gdzieś o lagach związanych z samym faktem przesyłania informacji. Zacząłem więc mierzyć opóźnienia w ten sposób:
- Klient pobiera u siebie timestamp
- Serwer otrzymuje info, pobiera u siebie timestamp, oblicza czas żądania odejmujac od siebie wartosci i to odsyla
- Klient znowu pobiera timestamp, i odejmuje od tego aktualnego wartość z serwera. Mamy czas odpowiedzi.
Problem pojawił się u mnie w ostatnim punkcie. Wyszło mi, że najbardziej aktualny timestamp klienta (Now) jest mniejszy od tego z serwera. Zakładałem, że każdy kolejny będzie większy.
Wyniki:
Client stamp: 1586885559.581
Server stamp: 1586885560.620
Now: 1586885559.738Req diff: 1.039147138595581
Res diff: -0.8821473121643066
Wychodzi przez to, że czas odpowiedzi jest ujemny :P Czy jest możliwość, że czas pobierany na różnych maszynach może się w ten sposób różnić? Czy popełniam jednak jakiś błąd?
Na froncie pobieram to przez:
t = new Date();
t.getTime();
a na backendzie:
from datetime import time
time.time()
Rozwiązałem tą sytuację tworząc api, które zwraca aktualny czas. Teraz i klient i serwer strzalają po ten czas. Wyniki są teraz zgodne z oczekiwanymi.
Czy wyniki, które uzyskałem wcześniej są normalne?