2012-02-10 130 views
3

在我的应用程序中,我有一个服务器和x客户端。当客户端启动时,他从服务器获得当前系统时间。每个客户端都必须使用服务器时间,并且不能使用他自己的系统时间。服务器和客户端之间的同步时钟

现在我的问题:什么是运行与当前服务器时间启动和运行接近同步它不接受每x秒的时间服务器在客户端上时钟的最佳方式?

目标是在客户端上显示带有服务器时间的运行时钟。

客户端时钟可能有公差是关于24小时1秒。

在我的解决方案我有触发每500ms和服务器的时间计数为500ms定时器执行时一个定时器。但这不是一个好的解决方案:)因为客户端时钟与服务器时间不同。

感谢您的回复要做到这一点

+0

这样做有什么目的?你需要轮询时间,经常或有可能重新考虑你的解决方案,只需要时间,当你需要它? – Marthin 2012-02-10 08:00:58

+3

我会依赖现有解决方案:http://en.wikipedia。org/wiki/Network_Time_Protocol(尽管这不会强制客户端使用服务器时间...) – 2012-02-10 08:01:45

+0

问题更新。 – Seffel 2012-02-10 08:35:00

回答

2

我找到完全适合我的情况一个解决方案的好处。 而不是使用System.currentTimeMillis(),我使用System.nanoTime()System.nanoTime()独立于系统时钟。

当我收到当前服务器时间,我节省额外的从系统中纳秒。然后,当前服务器时间将根据服务器接收时间与当前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 2012-02-10 08:38:18

+0

是的,如果用户在运行程序时改变系统时间,这个解决方案会给出错误的结果,那么它需要经常检查当前的服务器时间。网络时间协议会给你最好的结果,假设你能够使用它。 – 2012-02-10 08:56:50

+0

我不认为这有效。它依靠客户端时钟来确保正确,这就是问题所在。你只有一个时钟,一个在服务器上。 – momomo 2013-07-23 16:13:26

1

你几乎应该使用建立的时钟同步的方法,如the Network Time Protocol而不是建立自己的定制解决方案。它会为您提供更好的结果比你会让你自己,你有你的所有服务器同意它是什么时候:-)

相关问题