- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在寻找一种方法来以良好的精度(假设至少 0.5 秒)在客户端之间同步时间。
由于精度较差(一秒或更短),我排除在服务器响应 header 中使用 jsontime 或利用时间戳。
更新:它甚至可以使用移动连接。 3G 连接本身的往返时间约为 0.5 秒,这种情况并不少见(例如在意大利这里),因此算法必须稳健。
最佳答案
回到美好的旧时光ICMP Timestamp消息方案。用 JavaScript 和 PHP 实现相当简单。
下面是使用 JavaScript 和 PHP 实现此方案的方法:
// browser.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 个单位。时间差的等式总是发送 - 单向
时间。然而,这个等式的准确性取决于您计算单向时间的准确性。如果发送和接收消息的实际时间不相等或大致相等,您将需要找到一些其他方法来计算单程时间。但是,就您的目的而言,这应该足够了。
关于javascript - 以良好的精度(> 0.5s)(类似NTP)在javascript中同步时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8478179/
嗨,我正在考虑开发一种文件传输程序,想知道我是否想要尽可能好的加密,我应该使用什么? 我会用 C# 开发它,所以我可以访问 .net 库 :P在我的 usb 上有一个证书来访问服务器是没有问题的,如果
我创建的这个计算两个数组的交集是线性的方法的复杂度(在良好、平均、最差的情况下)? O(n) public void getInt(int[] a,int[] b){ int i=0; int
我已经能够使用 RTCPeerConnection.getStats() API 获得 WebRTC 音频调用的各种统计信息(抖动、RTT、丢包等)。 我需要将整体通话质量评为优秀、良好、一般或差。
基本问题: 如果我正在讲述/修改数据,我应该通过索引硬编码索引访问文件的元素,即 targetFile.getElement(5);通过硬编码标识符(内部翻译成索引),即 target.getElem
在 Linux 上,我想知道要调用什么“C”API 来获取每个 CPU 的统计信息。 我知道并且可以从我的应用程序中读取 /proc/loadavg,但这是系统范围的负载平均值,而不是每个 CPU 的
在客户端浏览器中使用 fetch api,GET 或 POST 没有问题,但 fetch 和 DELETE 有问题。它似乎将 DELETE 请求方法更改为 OPTIONS。 大多数研究表明是一个cor
我是一名优秀的程序员,十分优秀!