2009-05-29 7 views
19

J'ai besoin de mon logiciel pour communiquer avec un serveur NTP afin de déterminer le décalage de l'horloge locale. J'ai essayé d'utiliser le paquet org.apache.commons.net.ntp, mais son implémentation est plutôt mauvaise sous Windows, en raison de l'utilisation de System.currentTimeMillis() pour déterminer l'heure avant et après l'échange de paquets NTP. Comme vous le savez peut-être, cette valeur n'est mise à jour que lorsque l'horloge système est activée, ce qui est le cas sur la plupart des serveurs Win2k3 modernes à 64 Hz ou tous les 15,625 ms. Ceci limite grandement la précision du calcul du décalage d'horloge. Ntpd utilise la minuterie haute fréquence du processeur pour interpoler entre les graduations de l'horloge système et atteindre une résolution beaucoup plus élevée. Connaissez-vous une implémentation Java utilisant cette technique ou une technique similaire? Ou connaissez-vous d'autres implémentations NTP autres qu'Apache?Client Java NTP

+0

Pouvez-vous pas soumettre un patch à la bibliothèque Apache Commons? –

+2

Avec le temps de mettre en œuvre et de tester, et la volonté de mes supérieurs corporatifs, oui je pourrais. –

+0

J'ai demandé [à une question similaire] (https://softwarerecs.stackexchange.com/q/48920/1255) sur * Software Recommendations Stack Exchange *. –

Répondre

3

Si vous utilisez Java 5 ou supérieur, pouvez-vous utiliser System.nanoTime() pour effectuer une mesure plus précise des décalages horaires? Vous devrez modifier votre code NTP existant, mais vous devriez avoir la source pour cela, et je ne m'attendrais pas à ce que cela soit difficile.

+0

Oui, System.nanoTime() accède au temporisateur à haute fréquence, et je m'attendrais à ce qu'il soit utilisé pour l'horodatage dans une implémentation Java NTP décente. Cependant, ce n'est pas trivial, donc j'espère que quelqu'un d'autre a déjà fait et débogué. –

+0

Oui. Cependant, je n'ai pas trouvé d'implémentations évidentes. Une chance de célébrité et de respect, peut-être? :-) –

+1

System.nanoTime() ne peut être utilisé que pour mesurer le temps écoulé et n'est pas lié à une autre notion de système ou d'horloge murale. Il ne peut donc pas être utilisé pour comparer l'heure système locale à l'heure absolue d'un serveur NTP. – JasonM1

10

il y a une implémentation Java NTP sur support.ntp.org

+0

Hélas, c'est une implémentation naïve de SNTP. Mais +1 pour le trouver, merci. –

9

Étant donné que cette question se classe très élevé sur Google pour "Java NTP client":

Android a une belle, compacte implémentation sous licence Apache d'un client NTP simple : android.net.SntpClient.

Il devrait être modifié pour fonctionner sur Java non-Android, mais cela devrait être trivial, puisque le code est environ 100 lignes de code plus 100 autres lignes de commentaires détaillés, sans dépendances externes sauf l'horloge système Android - et par hasard, il est prêt à accepter des temporisations relatives comme nanoTime() puisqu'il utilise déjà un tel temporisateur relatif.

+0

Comment remplacer 'SystemClock.elapsedRealtime();' – Bhargav

Questions connexes