我正在寻找一种可以以很高的精度(至少可以说0.5秒)在客户端之间同步时间的方法。
由于精度不佳(一秒或更短),我不使用jsontime或在服务器响应标头中利用时间戳。
更新:即使在移动连接下也可以使用。3G连接本身具有0.5s左右的往返时间并不罕见(例如,在意大利),因此算法必须健壮。
求助于旧的ICMP
Timestamp
消息方案。用JavaScript和PHP实现非常简单。
这是使用JavaScript和PHP的此方案的实现:
// browser.html" target="_blank">js
var request = new XMLHttpRequest();
request.onreadystatechange = readystatechangehandler;
request.open("POST", "http://www.example.com/sync.php", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send("original=" + (new Date).getTime());
function readystatechangehandler() {
var returned = (new Date).getTime();
if (request.readyState === 4 && request.status === 200) {
var timestamp = request.responseText.split('|');
var original = + timestamp[0];
var receive = + timestamp[1];
var transmit = + timestamp[2];
var sending = receive - original;
var receiving = returned - transmit;
var roundtrip = sending + receiving;
var oneway = roundtrip / 2;
var difference = sending - oneway; // this is what you want
// so the server time will be client time + difference
}
}
现在查看sync.php
代码:
<?php
$receive = round(microtime(true) * 1000);
echo $_POST["original"] . '|';
echo $receive . '|';
echo round(microtime(true) * 1000);
?>
我还没有测试上面的代码,但是应该可以。
注意: 如果发送和接收消息的实际时间相同或大约相同,则以下方法将准确计算客户端与服务器之间的时间差。请考虑以下情形:
Time Client Server
-------- -------- --------
Original 0 2
Receive 3 5
Transmit 4 6
Returned 7 9
使用此数据,我们可以计算:
Sending = Receive - Original = 5 - 0 = 5
Receiving = Returned - Transmit = 7 - 6 = 1
Roundtrip = Sending + Receiving = 5 + 1 = 6
从上面可以看到,发送和接收时间的计算不正确,具体取决于客户端和服务器不同步的程度。但是,往返时间将始终是正确的,因为我们首先要添加两个单位(接收+原始),然后减去两个单位(返回-
发送)。
如果我们假设单向时间始终是往返时间的一半(即,发送时间是接收时间,那么我们可以很容易地计算出时差,如下所示):
Oneway = Roundtrip / 2 = 6 / 2 = 3
Difference = Sending - Oneway = 5 - 3 = 2
如您所见,我们准确地将时差计算为2个单位。时差方程始终是sending - oneway
时间。但是,此方程式的精度取决于您计算单向时间的精度。如果发送和接收消息的实际时间不相等或近似相等,则需要找到其他方法来计算单向时间。但是,出于您的目的,这已足够。
本文向大家介绍在Ubuntu中使用NTP实现时间同步,包括了在Ubuntu中使用NTP实现时间同步的使用技巧和注意事项,需要的朋友参考一下 NTP 是通过网络来同步时间的一种 TCP/IP 协议。通常客户端向服务器请求当前的时间,并根据结果来设置其时钟。 这个描述是挺简单的,实现这一功能却是极为复杂的 - 首先要有多层 NTP 服务器,第一层 NTP 服务器连接原子时钟,第二层、第三层服务器则担起
本文向大家介绍在 Ubuntu 中使用 NTP 进行时间同步设置,包括了在 Ubuntu 中使用 NTP 进行时间同步设置的使用技巧和注意事项,需要的朋友参考一下 NTP 是通过网络来同步时间的一种 TCP/IP 协议。通常客户端向服务器请求当前的时间,并根据结果来设置其时钟。 这个描述是挺简单的,实现这一功能却是极为复杂的 - 首先要有多层 NTP 服务器,第一层 NTP 服务器连接原子时钟,第
本文向大家介绍详解linux ntp服务器时间同步设置,包括了详解linux ntp服务器时间同步设置的使用技巧和注意事项,需要的朋友参考一下 linux ntp服务器时间同步设置 时间同步这个需求在很多地方都有。比如安装cm和cdh的话,需要ntp时间同步,否则会出现红色警告 这里主要是设置一台服务器作为主服务器,让其他机器同步这台机器的时间,而且是配置的本地时间,没有同步internet时间,
问题内容: 我想编写一个执行屏幕操作的Java终端应用程序。有没有好的图书馆可以让您像* nix / C世界中的诅咒一样操纵屏幕? 我正在寻找的最小功能是窗口和用户输入支持。 在功能方面,我想在终端的区域中定期更新一些数据,同时(同时)用户可以在屏幕的其他部分输入命令/文本。 问题答案: 有Charva,它链接到本机代码,但是具有基于Swing的api
我很感激每一个暗示,关于转移目标的文件实现。我已经研究了一些关于浮动精度的论文,但在过去的两周里没有取得太大的进展。 提前感谢!
问题内容: 我一直对JavaScript始终是异步的印象。但是,我了解到在某些情况下不是这样(即DOM操作)。关于何时何时同步以及何时异步,有什么好的参考?jQuery会完全影响吗? 问题答案: JavaScript始终是同步的并且是单线程的。如果您正在页面上执行JavaScript代码块,则该页面上当前将不会执行其他JavaScript。 JavaScript仅在可以进行Ajax调用的意义上是异