2009-05-29 11 views
19

Necesito mi software para comunicarme con un servidor NTP para determinar el desfase local del reloj. He intentado usar el paquete org.apache.commons.net.ntp, pero su implementación es bastante pobre 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 usted puede o no puede saber, este valor solo se actualiza cuando el reloj del sistema hace tic-tac, que en la mayoría de los servidores Win2k3 modernos es de 64Hz o cada 15.625ms. Esto limita en gran medida la precisión del cálculo del desplazamiento del reloj.Cliente Java NTP

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

+0

¿Puede usted no enviar un parche a la biblioteca Apache Commons? –

+2

Dado el tiempo para implementarlo y probarlo, y la disposición de mis señores de la corporación, sí podría. –

+0

Le pregunté [una Pregunta similar] (https://softwarerecs.stackexchange.com/q/48920/1255) en * Recomendaciones de software Stack Exchange *. –

Respuesta

3

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

+0

Sí, System.nanoTime() accede al temporizador de alta frecuencia, y espero que esto se use para marcar el tiempo en una implementación Java NTP decente. Sin embargo, esto no es trivial, así que espero que alguien más ya lo haya hecho y lo depure. –

+0

Sí. Sin embargo, no pude encontrar ninguna implementación obvia. Una oportunidad para la fama y el respeto, tal vez? :-) –

+1

System.nanoTime() solo se puede usar para medir el tiempo transcurrido y no está relacionado con ninguna otra noción del sistema o del reloj de pared, por lo que no se puede usar para comparar el tiempo del sistema local con el tiempo absoluto desde un servidor NTP. – JasonM1

10

hay una aplicación NTP Java en support.ntp.org

+0

Por desgracia, es una implementación ingenua de SNTP. Pero +1 por encontrarlo, gracias. –

9

Dado que esta cuestión ocupa un lugar muy alto en Google de "cliente Java NTP":

Android tiene una buena compacta aplicación, con licencia de Apache de un cliente simple NTP : android.net.SntpClient.

Tendría que ser modificado para ejecutarse en un Java no 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 sistema Android - y por casualidad, está listo para aceptar temporizadores relativos como nanoTime() ya que ya utiliza un temporizador relativo.

+0

¿Cómo se reemplaza 'SystemClock.elapsedRealtime();'? – Bhargav