2009-05-29 15 views
19

Ho bisogno del mio software per comunicare con un server NTP per determinare l'offset dell'orologio locale. Ho provato a utilizzare il pacchetto org.apache.commons.net.ntp, ma la sua implementazione è piuttosto scarsa durante l'esecuzione su Windows, a causa dell'uso di System.currentTimeMillis() per determinare il tempo prima e dopo lo scambio di pacchetti NTP. Come si può o non si può sapere, questo valore viene aggiornato solo quando l'orologio di sistema fa tic tac, che nella maggior parte dei moderni server Win2k3 è a 64 Hz o ogni 15.625 ms. Ciò limita notevolmente la precisione del calcolo dell'offset dell'orologio.Client NTP Java

Ntpd utilizza il temporizzatore ad alta frequenza della CPU per interpolare tra i tick di clock del sistema e ottenere tempi di risoluzione molto più elevati. Conoscete un'implementazione Java che utilizza questa o una tecnica simile? O conosci qualche altra implementazione NTP diversa da Apache?

+0

si fa a non inviare una patch alla libreria Apache Commons? –

+2

Dato il tempo di implementarlo e testarlo, e la disponibilità dei miei signori aziendali, sì, potrei. –

+0

Ho chiesto [una domanda simile] (https://softwarerecs.stackexchange.com/q/48920/1255) su * Scambio di stack Raccomandazioni software *. –

risposta

3

Se si utilizza Java 5 o versione successiva, è possibile utilizzare System.nanoTime() per eseguire una misurazione più accurata degli scostamenti di tempo? Dovresti modificare il tuo codice NTP esistente, ma dovresti avere la fonte per farlo e non mi aspetto che questo sia difficile.

+0

Sì, System.nanoTime() accede al timer ad alta frequenza, e mi aspetto che questo venga usato per il timestamping in una discreta implementazione NTP Java. Tuttavia, questo non è banale, quindi spero che qualcun altro l'abbia già fatto e lo abbia debugato. –

+0

Sì. Non sono riuscito a trovare nessuna implementazione ovvia. Una possibilità di fama e rispetto, forse? :-) –

+1

System.nanoTime() può essere utilizzato solo per misurare il tempo trascorso e non è correlato a nessun'altra nozione di orario di sistema o wall-clock, quindi non può essere usato per confrontare l'ora locale del sistema con il tempo assoluto da un server NTP. – JasonM1

10

c'è un'implementazione NTP Java su support.ntp.org

+0

Purtroppo, è un'implementazione ingenua di SNTP. Ma +1 per trovarlo, grazie. –

9

Poiché tale questione si colloca molto alto su Google per "client Java NTP":

Android ha una bella, compatta implementazione Apache con licenza di un cliente semplice NTP : android.net.SntpClient.

Dovrebbe essere modificato per funzionare su Java non Android, ma questo dovrebbe essere banale, poiché il codice è di circa 100 righe di codice più altre 100 righe di commenti dettagliati, senza dipendenze esterne eccetto l'orologio di sistema Android - e per caso, è pronto ad accettare timer relativi come nanoTime() poiché utilizza già un timer relativo.

+0

Come si sostituisce 'SystemClock.elapsedRealtime();'? – Bhargav