2012-02-10 26 views
3

私のアプリケーションでは、サーバとクライアントがあります。クライアントが起動すると、サーバーから現在のシステム時刻が取得されました。すべてのクライアントはサーバー時間で動作しなければならず、自分のシステム時間を使用できません。サーバとクライアント間の同期クロック

今質問:現在のサーバー時刻から始まり、それにほぼ同期して実行される時計をクライアントで実行する最も良い方法は何ですか?

目標は、時計をクライアント上のサーバー時刻で表示することです。

クライアントのクロックが持つ許容範囲は、24時間で約1秒です。

私の解決策では、タイマが実行されると、500msごとにトリガされ、500msがカウントされます。しかし、これは良い解決策ではありません:)クライアントの時計がサーバーの時刻と異なるためです。これを行うには

+0

これの意図は何ですか?あなたは頻繁に時間を尋ねる必要がありますか、またはyuorソリューションを再考することが可能で、必要な時にだけ時間を得ることが可能でしょうか? – Marthin

+3

私は既存のソリューションに頼っていました。http://en.wikipediaorg/wiki/Network_Time_Protocol(ただし、クライアントがサーバ時間を使用するよう強制しません...) –

+0

質問の更新。 – Seffel

答えて

2

私の状況に完全に合った解決策が見つかりました。 System.currentTimeMillis()の代わりにSystem.nanoTime()を使用しています。 System.nanoTime()は、システムクロックとは独立しています。

現在のサーバー時間を受け取ったとき、システムからnsを追加保存します。それから、現在のサーバ時間は、受信したサーバ時間からのns時間と現在のnanoTimeとサーバ時間との差で計算されます。

例:

// The Client starts and receive the current Server time and the nanoTime 
private long   serverTime = server.getCurrentTime(); 
private long   systemNano = System.nanoTime(); 

//To calculate the current Server time without a service call 
                     //ns-> ms 
long currentServerTime = serverTime + ((System.nanoTime() - systemNano)/1000000); 

Thxを

1

一つの方法は、サーバの時刻との差とローカルタイムを取得し、時間の計算のために

  • クライアントからの時間を開始し、取得することを使用することですお返事のための

    感謝サーバー(私は現在の時間をミリ秒単位で使用すると仮定しますが、使用しているものに合わせて調整することができます)

  • クライアントは現在のシステム時刻を確認してその差を保存します
  • 例サーバの時刻に

を計算するために、クライアント上の現在のシステム時刻に適用される:明らか

long serverTime = 1328860926471l; // 2012/02/10 10:02, received from wherever 
long currentTime = System.currentTimeMillis(); // current client time 
long difference = currentTime - serverTime; 

// Server time can then me retrieved like this: 
long currentServerTime = System.currentTimeMillis() - difference;  
Date serverTimeDate = new Date(currentServerTime); 

は違いは、サーバーの時刻を受信した瞬間を保存する必要があります。

+0

クライアントが自分のシステム時刻を変更したときはどうなりますか?それで、なぜ私はクライアント上で 'System.currentTimeMillis()'を使わずに解決策を探しています。 – Seffel

+0

プログラムを実行しているときにユーザーがシステム時刻を変更すると、このソリューションは間違った結果を出すでしょう。 Network Time Protocolを使用すると、最良の結果が得られます。 –

+0

私はこれが動作するとは思わない。それは実際に正しいとクライアントクロックに依存しています、それは質問についてです。サーバーには1つのクロックしかありません。 – momomo

1

独自のカスタムソリューションを構築するのではなく、確かにthe Network Time Protocolなどの確立されたクロック同期方法を使用する必要があります。それは自分よりも優れた結果を提供し、あなたのサーバーはすべての時間について同意する追加の利点を持っています:-)

関連する問題