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
はい、お使いのシステムクロックが同期され、およびJavaは、システムクロックを使用しています。
は完全なコードのために、クライアントの例を参照してください。 – Andreas
私はこのシナリオをチェックします:2つの異なるサーバーで、sudo apt-get install ntpを使ってntpをインストールしました。その後、あるサーバーからSystem.currentTimeMillis()を読み取り、それを他のサーバーに送信します。もう一方のサーバーは、currentTimeMillisを使用して独自の時刻を読み取り、別のサーバーを表示します。違いは97秒以上です!何かが間違っていると確信しています。どの部分が分かっていますか? –