2009-05-29 12 views
19

Potrzebuję mojego oprogramowania do komunikacji z serwerem NTP, aby określić lokalne przesunięcie 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.Klient Java NTP

Ntpd korzysta z timera wysokiej częstotliwości procesora do interpolacji między tykami zegara systemowego i uzyskania znacznie wyższej rozdzielczości czasu. Czy znasz implementację Java, która używa tej lub podobnej techniki? Czy znasz jakieś inne implementacje NTP inne niż Apache?

+0

Nie możesz złożyć poprawkę do biblioteki Apache Commons? –

+2

Zważywszy na czas, aby go wdrożyć i przetestować oraz chęć moich korporacyjnych panów, tak, mogłem. –

+0

Zapytałem [podobne pytanie] (https://softwarerecs.stackexchange.com/q/48920/1255) w sprawie * Aktualizacji stosu rekomendacji oprogramowania *. –

Odpowiedz

3

Jeśli używasz środowiska Java 5 lub nowszego, możesz użyć System.nanoTime(), aby 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.

+0

Tak, System.nanoTime() uzyskuje dostęp do timera wysokiej częstotliwości, a spodziewałbym się, że zostanie użyty do znacznika czasu w przyzwoitej implementacji protokołu Java NTP. Jest to jednak nietrywialne, więc mam nadzieję, że ktoś już to zrobił i debugował go. –

+0

Tak. Nie mogłem jednak znaleźć żadnych oczywistych implementacji. Szansa na sławę i szacunek? :-) –

+1

System.nanoTime() może być używany tylko do mierzenia czasu, który upłynął i nie jest zwią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

10

jest implementacja NTP Java na support.ntp.org

+0

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

9

Ponieważ kwestia ta plasuje się bardzo wysoko w Google dla „Java Klient NTP”:

Android ma ładny, kompaktowy Apache licencjonowany wdrożenie prosty klient NTP : 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 oprócz zegara systemu Android - i przez przypadek jest gotowy do zaakceptowania względnych timerów, takich jak nanoTime(), ponieważ używa już takiego względnego timera.

+0

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