将Javascript时钟与服务器时钟同步
背景
我正在创建一个AJAX聊天系统。 它看起来像这样:
迈克 - 嗨简 - 5分钟前
简 - 你好迈克 - 4分钟前
迈克 - 最近怎么样 - 3秒前
简 - 我做得很好 - 1秒前
Javascript每分钟轮询一次服务器,服务器用最新的10条消息作出响应。 附加到每条消息是一个Unix时间戳(PHP时间())。 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;
}
}
正如我在这个答案中解释的那样,精确度有限,实质上,任何小于请求往返时间的时钟偏差都不可检测。 如果您确实需要尽可能精确的时间,请为服务器创建一个特殊的请求类型,以便尽可能快地完成往返。
但是,您可以识别本地时钟明显疯狂的浏览器,因为观察到的服务器时间不会落在请求的本地开始时间和结束时间之间。 既然你不能将它拉远得比这更远,只需在本地请求[开始,结束]间隔内选择一个任意时间,并将其视为等同于接收到的服务器时间。
我们遇到了类似的问题。 我们的解决方案是简单地忽略浏览器时钟。 如果消息带有服务器时间戳,则按照该时间戳对它们进行排序。 然后,只需将数据转换为浏览器时间即可。 所有的计算和排序都是基于服务器时间。 这样,你所要做的就是让你的服务器全部同步。
使用闪存和套接字服务器。 如果你需要100%准确。 我已经为应用程序编写了一个套接字服务器,该应用程序每隔1秒向Flash元素广播一次,并准确告诉它显示的内容。
这是一个基于金融的应用程序,它需要始终保持100%的准确性。
我们还将其与FMS配对,以便能够通过企业防火墙。
如果你使用JavaScript,你将无法达到准确性。
可能html5会很快解决这个问题
链接地址: http://www.djcxy.com/p/86165.html