Mierzenie czasu w aplikacji sieciowej

0

Czesc,
mam nastepujacy problem i nie bardzo wiem jak sie do niego zabrac.

Mam serwer oraz 2ch klientow. Zalozmy, ze chca sobie zagrac w szachy. Trzeba im mierzyc czas i prezentowac pozostaly czas przeciwnika. Macie moze jakies materialy albo mozecie podpowiedziec jak moznaby to rozwiazac?

Czy mierzyc ten czas na serwerze i przekazywac po prostu info do klientow? mierzyc i u klientow i na serwerze i kontrolowac czy sie zgadza czy moze u samych klientow?

Jak dopilnowac zeby prezentowany czas byl adekwatny do tego jaki jest w rzeczywistosci?

Nie oczekuje oczywiscie zadnego kodu tylko propozycji jak moznaby sie do tego zabrac w ogole :)

pozdrawiam!

1

Kiedyś spotkałem się z podobnym problemem i opiszę Ci jedynie + i - danego rozwiązania bo idealne żadne nie jest. Rozwiązanie @niezdecydowany czyli pilnowanie czasu po stronie serwera ma tą zaletę, że czas jest analizowany w jednym miejscu jednak jeżeli klient będzie miał np problem ze stabilnością łącza (mówię o reconnect) to odświeżanie czasu nie będzie możliwe i nawet jeżeli aplikacja kliencka się połączy ponownie to będzie przeskok w pozostałym czasie zamiast płynnego przejścia. Obliczanie czasu po stronie klienta spowoduje, że będzie można za pomocą offsetów dowolnie ten czas modyfikować (oczywiście posiadając odpowiednią wiedzę). Ja u siebie zastosowałem oba rozwiązania tj. klient miał swój timer (aby czas był płynny nawet w przypadku braku połączenia) ale oprócz tego był drugi timer na serwerze. Oba timery były synchronizowane (gdy np klient połączył się ponownie). Zastosowanie takiego rozwiązania pozwoli Ci np wyświetlić pozostały czas przeciwnika jak i swój.

0

Właśnie chciałbym uniknąć problemu z przeskokiem czasu czyli, że klient myśli, że ma np 5 minut a nagle po aktualizacji sie okazuje, że ma 4...
Pomijając to możesz podpowiedzieć jak zaimplementować taką synchronizację czasu? Nie chodzi mi o kod a o samo rozwiązanie. Kiedy to sprawdzać, jak aktualizować?

pozdr.

2

To może inaczej jeśli faktycznie mówimy o szachach to ja bym to rozwiązał w ten sposób, że na serwerze ustawiałbym licznik (5 min partia to licznik = 300). Białe naciskają start i czekamy aż czarne nacisną start (wciśnięcie start to odpowiedni komunikat do serwera). Gdy mamy informacje z obu klientów że wciśnięto start to białym (bo one zaczynają) odpalamy licznik na serwerze i wysyłamy paczkę do klienta A (białe) odblokowując ruch i ruszając timer po stronie klienta. Gdy białe wykonają ruch i nacisną stop czasu (lub jeśli olewasz element z zegarem z realnych szachów to po samym ruchu) wysyłamy paczkę do serwera z informacją o ruchu i zatrzymujemy timer po stronie klienta. Na serwerze po odebraniu paczki od klienta A (białe) robimy stop czasu klienta A (białe) i zwrotnie odsyłamy paczkę do klienta A (białe) z informacją o pozostałym czasie oraz w tym samym czasie wysyłamy paczkę do klienta B (czarne) odblokowując ruch i startując timer klienta B (czarne) itd. Przy szybkim łączu i stałym połączeniu nie powinno być lagów, a ewentualne przesunięcia wynosiłyby tak nieduże wartości, że użytkownik nie powinien tego zauważyć. Ponadto nawet przy chwilowym braku połączenia z serwerem (reconnect możesz sobie np na oddzielnym wątku zrobić) timer po stronie klienta dalej będzie odliczał czas w dół bez efektu zatrzymania.
Istotne jest też abyś timer klienta zatrzymał dopiero w momencie gdy otrzymasz paczkę z czasem z serwera.

0

Super Woolfik o takie coś mi chodziło. Postaram się to zaimplementować i dam znać o rezultatach :) Jeżeli jednak ktoś ma jeszcze jakiś pomysł to zachęcam do podzielenia się!:)

1 użytkowników online, w tym zalogowanych: 0, gości: 1