背景
我正在创建一个AJAX聊天系统。看起来是这样的:
Mike -嗨简-5分钟前
Jane -嗨迈克-4分钟前
Mike -进展如何-3秒前
Jane -1秒钟前我做得很好
Javascript每分钟轮询服务器一次,服务器使用10条最新消息进行响应。附加到每条消息的是一个Unix时间戳(PHP time())。Javascript负责将用户当前拥有的缓冲消息与这个新的服务器响应合并。消息的交织和"X时间前“消息的准确性取决于Javascript时钟与服务器时钟的同步程度。
问题
如何将Javascript时钟与服务器时钟精确同步?下面是我到目前为止的情况。我想让它更准确。目前,它不考虑执行同步的Ajax的往返时间。如何知道往返中发送、处理和接收的比例?此外,你如何处理用户的时钟水晶只是简单的崩溃-例如:现在是格林尼治时间晚上7:20,但他们的时钟实际上是晚上7:15格林尼治标准时间?
Clock = {
serverOffset = 0;
synch: function() {
new Ajax.Request(
'/getServerTime.php', {
onSuccess: function(transport) {
this.serverOffset = parseInt(transport.responseText) -
new Date().getTime() / 1000;
}
}
);
},
getServerTime: function(myTime) {
if (typeof(myTime) === 'undefined') {
myTime = new Date().getTime() / 1000;
}
return myTime + this.serverOffset;
},
serverToMyTime: function(serverTime) {
return serverTime - this.serverOffset;
}
}发布于 2010-11-25 01:28:25
正如我在this answer中解释的,你的精确性是有限度的--本质上,任何比请求往返时间更小的时钟倾斜都是无法探测到的。如果你真的需要时间尽可能的精确,为服务器创建一个特殊的请求类型,它只会得到时间,并尽你所能使往返尽可能快。
但是,您可以识别其本地时钟明显异常的浏览器,因为观察到的服务器时间不会介于请求的本地开始时间和结束时间之间。由于您不能将其压缩得更远,所以只需在本地请求开始、结束间隔内选择一个任意时间,并将其视为等效于接收的服务器时间。
发布于 2010-11-25 01:27:43
我们也遇到过类似的问题。我们的解决方案是简单地忽略浏览器时钟。如果消息带有服务器时间戳,只需按时间戳对它们进行排序。然后,您所需要做的就是在显示数据时,将其转换为浏览器时间。然而,所有的计算和排序都是基于服务器时间的。这样,你所要做的就是让你的服务器时刻同步。
发布于 2011-06-21 00:57:57
使用闪存和套接字服务器。如果你需要100%的准确性。我已经为一个应用程序编写了一个套接字服务器,它每1秒向一个flash元素广播时间,并告诉它具体要显示什么。
这是一个基于金融的应用程序,它需要始终100%的准确性。
我们还将其与FMS结合起来,以便能够穿越公司防火墙。
如果您使用javascript,您将无法达到准确性。
html5可能很快就会用套接字解决这个问题。
https://stackoverflow.com/questions/4272978
复制相似问题