Pytanie Klient Java NTP


Potrzebuję mojego oprogramowania do komunikacji z serwerem NTP w celu określenia lokalnego przesunięcia zegara. Próbowałem używać pakietu org.apache.commons.net.ntp, ale jego implementacja jest raczej słaba podczas działania w systemie Windows, z powodu użycia System.currentTimeMillis () w celu określenia czasu przed i po wymianie pakietów NTP. Jak możesz lub nie możesz wiedzieć, ta wartość jest aktualizowana tylko wtedy, gdy zegar systemowy działa, co na większości nowoczesnych serwerów Win2k3 ma częstotliwość 64 Hz lub co 15.625ms. To znacznie ogranicza dokładność obliczeń przesunięcia zegara.

Ntpd używa timera wysokiej częstotliwości do interpolacji między tykami zegara systemowego i osiąga znacznie większą rozdzielczość. Czy znasz implementację Java, która używa tej lub podobnej techniki? Czy znasz jakieś inne implementacje NTP inne niż Apache?


19
2018-05-29 09:38


pochodzenie


Czy nie możesz przesłać poprawki do biblioteki Apache Commons? - Bill Michell
Zważywszy na czas, aby go wdrożyć i przetestować, i chęć moich korporacyjnych panów, tak, mogłem. - Matt Howells
Zapytałam podobne pytanie na Aktualizacja wymiany zaleceń oprogramowania. - Basil Bourque


Odpowiedzi:


istnieje implementacja Java NTP support.ntp.org


10
2018-05-29 09:49



Niestety, jest to naiwna implementacja SNTP. Ale +1 za znalezienie, dzięki. - Matt Howells


Ponieważ to pytanie jest bardzo wysokie w Google dla "klienta Java NTP":

Android ma ładną, kompaktową implementację prostego klienta NTP z licencją Apache: android.net.SntpClient.

Musiałby zostać zmodyfikowany, aby działał na java innych niż Android, ale powinno to być trywialne, ponieważ kod zawiera około 100 linii kodu plus kolejne 100 linii szczegółowych komentarzy, bez zewnętrznych zależności, z wyjątkiem zegara systemu Android - i przez przypadek , jest gotowy do zaakceptowania względnych timerów, takich jak nanoTime() ponieważ już korzysta z takiego względnego timera.


9
2018-06-15 09:48



Jak zastąpić SystemClock.elapsedRealtime(); ? - Bhargav


Jeśli używasz języka Java 5 lub nowszego, możesz użyć System.nanoTime () wykonać dokładniejszy pomiar przesunięć czasowych? Będziesz musiał zmodyfikować swój istniejący kod NTP, ale powinieneś mieć jego źródło i nie spodziewałbym się, że będzie to trudne.


3
2018-05-29 09:47



Tak, System.nanoTime () uzyskuje dostęp do timera wysokiej częstotliwości i oczekiwałbym, że będzie to wykorzystywane do oznaczania znaczników czasu w przyzwoitej implementacji protokołu Java NTP. Jest to jednak nietrywialne, więc mam nadzieję, że ktoś już to zrobił i debugował go. - Matt Howells
Tak. Nie mogłem jednak znaleźć żadnych oczywistych implementacji. Szansa na sławę i szacunek? :-) - Brian Agnew
System.nanoTime () może być używany tylko do mierzenia czasu, który upłynął i nie jest powiązany z żadnym innym pojęciem czasu systemu lub zegara ściennego, więc nie może być użyty do porównania lokalnego czasu systemu z czasem bezwzględnym z serwera NTP. - JasonM1


Napisałem implementację Java (Java 7), której można użyć: SntpClient


3
2017-11-27 17:05