2012-02-10 4 views
3

내 응용 프로그램에는 Server and x Clients가 있습니다. 클라이언트가 시작되면 서버에서 현재 시스템 시간을 얻습니다. 모든 클라이언트는 서버 시간으로 작업해야하며 자신의 시스템 시간을 사용할 수 없습니다.서버와 클라이언트 사이의 동기 클럭

지금 내 질문 : 현재 서버 시간으로 시작하여 매 x 초마다 서버 시간을받지 않고 거의 동기식으로 실행되는 클라이언트에서 시계를 실행하는 가장 좋은 방법은 무엇입니까?

목표는 클라이언트에서 서버 시간과 함께 시계를 실행하는 을 표시하는 것입니다.

클라이언트 시계에 허용되는 허용 오차는 24 시간 내에 약 1 초입니다.

제 솔루션에서 저는 타이머가 실행될 때마다 500ms마다 트리거하고 서버 시간에 500ms를 카운트하는 타이머를 얻었습니다. 하지만 이것은 좋은 해결책이 아닙니다 :) 클라이언트 시계가 서버 시간과 다르기 때문입니다. 이 작업을 수행하는

+0

이의 의도는 무엇입니까? 수시로 또는 yuor 솔루션을 다시 생각해보고 필요할 때만 시간을 확보 할 수있는 시간을 설문 조사해야합니까? – Marthin

+3

기존 솔루션 (http://en.wikipedia.com/)에 의존하고 싶습니다.org/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); 

들으

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

예, 프로그램을 실행하는 동안 사용자가 시스템 시간을 변경하면이 솔루션이 잘못된 결과를 나타낼 수 있으므로 현재 서버 시간을 자주 확인해야합니다. 네트워크 시간 프로토콜을 사용하면 최상의 결과를 얻을 수 있습니다. –

+0

나는 이것이 작동한다고 생각하지 않는다. 그것은 실제로 정확한지 클라이언트 시계에 의존합니다. 이것이 바로 질문에 관한 것입니다. 하나의 시계 만 서버에 있습니다. – momomo

1

자신 만의 맞춤 솔루션을 구축하는 대신 시계 동기화 동기화 방법 (예 : the Network Time Protocol)을 사용해야합니다. 그것은 당신보다 더 나은 결과를 제공 할 것이며, 모든 시간에 대해 모든 서버가 동의한다는 추가적인 이점을 누릴 수 있습니다 :-)

관련 문제