2016-08-02 16 views
6

私はJavaで書かれた分散プログラムを持っています。私は自分のノードが同期した物理時計にアクセスしたい。JavaでNTPクロックにアクセスするにはどうすればいいですか

私はNTPが物理時計の同期のためのプロトコルであることを知っています。私はsudo apt-get ntpでlinuxにインストールできることを知っています。

私の質問は私がインストールするとき、私はどのように私のJavaプログラムでこの同期クロックにアクセスできますか?マシンにntpをインストールするとどうなりますか?私のシステムクロックは同期されますか?

感謝:)

+1

はい、お使いのシステムクロックが同期され、およびJavaは、システムクロックを使用しています。

は完全なコードのために、クライアントの例を参照してください。 – Andreas

+0

私はこのシナリオをチェックします:2つの異なるサーバーで、sudo apt-get install ntpを使ってntpをインストールしました。その後、あるサーバーからSystem.currentTimeMillis()を読み取り、それを他のサーバーに送信します。もう一方のサーバーは、currentTimeMillisを使用して独自の時刻を読み取り、別のサーバーを表示します。違いは97秒以上です!何かが間違っていると確信しています。どの部分が分かっていますか? –

答えて

7

あなたの設定NTP、システム時刻がNTPサーバの時刻と同期されます。 System.currentTimeMillis()を使用すると、自動調整されたシステムクロックの値を持ちます。

Timerはシステムクロックの変更に敏感である可能性があることに注意してください.ScheduledThreadPoolExecutorはシステムクロックの変更に敏感です。 Scheduler Impacts with clock changes

+0

ありがとうございました。私も関連する質問があります:ntpサーバーが死んでもどうなりますか?書かれて、ntpサーバーに依存しているすべてのプログラムが壊れますか? 私は自分のノードのクロックだけを同期させる方法を好むでしょう。実際の実際の時間は気にしないし、世界の残りの部分についても気にしない。私は自分のノードを同期させたいだけです。それのための方法はありますか? –

+0

NTPサーバーは通常非常に高可用性ですが、NTPサーバーへのネットワークリンクの可能性があります。あなたは非常にシンプルな同期オプションを持つことができます:あなたのノードの1つがあなたが時刻を同期させたいマスターであり、マスターがsshを実行していると仮定します。ssh上で次のコマンドを使用すると、現在の時刻を取得できます(スレーブノードとマスターノードの間にパスワードなしのsshを設定する必要があります)。 date --set = "$(ssh user @ server date)" – ravthiru

+0

このコマンドを1回呼び出すと、自分のマシンの日付がmasterと同期するように設定されます。または、クロックを取得するたびにコマンドを実行する必要があります? –

3

JavaのNTP情報にアクセスする場合は、NTPパケットフォーマット(NTP RFC-1305)設定モードフィールドに適合するUDPパケットをMODE_CLIENT(3)に作成し、NTPサーバポート123にパケットを送信し、応答を聞いてください。

Apache Commons Net libraryには、わずか数行のコードを使用してこれを行うためのフレームワークがすでに用意されています。

NTPUDPClient client = new NTPUDPClient(); 
client.open(); 
InetAddress hostAddr = InetAddress.getByName("*insert-target-server-host-name.com*"); 
TimeInfo info = client.getTime(hostAddr); 
info.computeDetails(); // compute offset/delay if not already done 
Long offsetValue = info.getOffset(); 
Long delayValue = info.getDelay(); 
String delay = (delayValue == null) ? "N/A" : delayValue.toString(); 
String offset = (offsetValue == null) ? "N/A" : offsetValue.toString(); 

System.out.println(" Roundtrip delay(ms)=" + delay 
       + ", clock offset(ms)=" + offset); // offset in ms 
client.close(); 

ローカルクロックオフセットことを注意(又は時間ドリフト)は、この標準のNTP式に従ってローカルクロックとNTPサーバのクロックに対して計算されます。 OriginateTimestampクライアントがパケット(T1)、 ReceiveTimestampを送信したローカル時刻である

LocalClockOffset = ((ReceiveTimestamp - OriginateTimestamp) + 
          (TransmitTimestamp - DestinationTimestamp))/2 

は、サーバによって送信された時間応答(NTPサーバ(T2)、 TransmitTimestampによって受信された時間要求されt3)、およびDestinationTimestampは、ローカルマシン上のクライアントが応答を受信した時刻です(t4)。
https://commons.apache.org/proper/commons-net/examples/ntp/NTPClient.java

関連する問題