java ntp

Cliente Java NTP



(4)

Necesito que mi software se comunique con un servidor NTP para determinar el desplazamiento del reloj local. He intentado usar el paquete org.apache.commons.net.ntp, pero su implementación es bastante mala cuando se ejecuta en Windows, debido al uso de System.currentTimeMillis () para determinar el tiempo antes y después del intercambio de paquetes NTP. Como puede o no puede saber, este valor solo se actualiza cuando el reloj del sistema hace tictac, que en la mayoría de los servidores Win2k3 modernos está a 64Hz o cada 15.625 ms. Esto limita en gran medida la precisión del cálculo del desplazamiento del reloj.

Ntpd utiliza el temporizador de alta frecuencia de la CPU para interpolar entre los tics del reloj del sistema y lograr un tiempo de resolución mucho más alto. ¿Conoce una implementación de Java que use esta o una técnica similar? ¿O conoce alguna otra implementación NTP que no sea la de Apache?


Dado que esta pregunta ocupa un lugar muy alto en Google para "cliente Java NTP":

Android tiene una implementación agradable y compacta con licencia Apache de un cliente NTP simple: android.net.SntpClient .

Debería modificarse para ejecutarse en Java que no sea de Android, pero esto debería ser trivial, ya que el código es de aproximadamente 100 líneas de código más otras 100 líneas de comentarios detallados, sin dependencias externas excepto el reloj del sistema Android, y por casualidad , está listo para aceptar temporizadores relativos como nanoTime() ya que ya usa un temporizador relativo de este tipo.


He escrito una implementación de Java (Java 7) que puedes usar: SntpClient


Si está utilizando Java 5 o superior, ¿puede usar System.nanoTime() para realizar una medición más precisa de las compensaciones de tiempo? Tendrías que modificar tu código NTP existente, pero deberías tener la fuente para ello, y no esperaría que esto fuera difícil.