以良好的精度(> 0.5s)(类似于NTP)在javascript中同步时间

以良好的精度(> 0.5s)(类似于NTP)在javascript中同步时间,第1张

以良好的精度(> 0.5s)(类似于NTP)在javascript中同步时间

求助于旧的ICMP
Timestamp
消息方案。用Javascript和PHP实现非常简单。

这是使用Javascript和PHP的此方案的实现:

// browser.jsvar request = new XMLHttpRequest();request.onreadystatechange = readystatechangehandler;request.open("POST", "http://www.example.com/sync.php", true);request.setRequestHeader("Content-Type", "application/x-www-form-urlenpred");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        2Receive         3        5Transmit        4        6Returned        7        9
  1. 如您所见,客户端和服务器时钟的同步时间为2个单位。因此,当客户端发送时间戳请求时,它将原始时间记录为0。
  2. 服务器在3个单位后收到请求,但由于接收时间提前2个单位,因此将接收时间记录为5个单位。
  3. 然后,它将时间戳回复发送一个单位,然后将发送时间记录为6个单位。
  4. 客户端在3个单位(即根据服务器为9个单位)之后收到答复。但是,由于它比服务器落后2个单位,因此它将返回的时间记录为7个单位。

使用此数据,我们可以计算:

Sending = Receive - Original = 5 - 0 = 5Receiving = Returned - Transmit = 7 - 6 = 1Roundtrip = Sending + Receiving = 5 + 1 = 6

从上面可以看到,发送和接收时间的计算不正确,具体取决于客户端和服务器不同步的程度。但是,往返时间将始终是正确的,因为我们首先要添加两个单位(接收+原始),然后减去两个单位(返回-
发送)。

如果我们假设单向时间始终是往返时间的一半(即,发送时间是接收时间,那么我们可以很容易地计算出时差,如下所示):

oneway = Roundtrip / 2 = 6 / 2 = 3Difference = Sending - oneway = 5 - 3 = 2

如您所见,我们准确地将时差计算为2个单位。时差方程始终是

sending -oneway
时间。但是,此方程式的精度取决于您计算单向时间的精度。如果发送和接收消息的实际时间不相等或近似相等,则需要找到其他方法来计算单向时间。但是,出于您的目的,这已足够。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5010512.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-14
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存