如何解决Javascript:与服务器同步
我想与我的服务器同步并找到一些代码(这可能是我自己的起点):
var serverDateTimeOffset
function getServerDateTime() {
if (serverDateTimeOffset === undefined || serverDateTimeOffset === null) {
serverDateTimeOffset = 0; //while syncing with the server,do not start a new sync,but return localtime
var clientTimestamp = (new Date()).valueOf();
$.getJSON('/getDateTime.ashx?ct=' + clientTimestamp,function (data) {
var NowTimeStamp = (new Date()).valueOf();
var serverTimestamp = data.serverTimestamp;
var serverClientRequestDiffTime = data.diff;
var serverClientResponseDiffTime = NowTimeStamp - serverTimestamp;
var responseTime = (serverClientRequestDiffTime - NowTimeStamp + clientTimestamp - serverClientResponseDiffTime) / 2
var syncedServerTime = new Date((new Date()).valueOf() - (serverClientResponseDiffTime - responseTime) / 2);
serverDateTimeOffset = (serverClientResponseDiffTime - responseTime) / 2;
console.log("synced time with server:",syncedServerTime,serverDateTimeOffset);
})
}
return new Date((new Date()).valueOf() - serverDateTimeOffset);
}
但我不明白变量 responseTime 的含义是什么(以及它背后的逻辑推理)。它代表什么?有人有建议吗?看起来它结合了一些相对时间和绝对时间。
我的推理示例: 10 从客户端开始 ==+5(传输中的请求)==> 15(到达)==>(服务器处理 +5)==> 发送之前(20)==+7(传输中的响应)==> 27 (回到客户端)。 responseTime 的计算结果为 -19/2 = -9.5。
当接收时间与服务器发送时间相同时(服务器处理为 0),则 5 -22 + 10 -7 responseTime 结果为 -14/2 = -7。
那么变量 serverDateTimeOffset 呢?
我错过了什么吗?我找到了可能有帮助的 NTP 描述:
将客户端同步到网络服务器由多个数据包交换组成,其中每个交换是一对请求和回复。发送请求时,客户端将自己的时间 ( ) 存储到正在发送的数据包中。当服务器收到这样的数据包时,它会依次将自己的时间(接收方在收到回复时,会再次记录自己的接收时间,以估计数据包的行程时间。假设延迟对称,估计行程时间(延迟)为“总延迟减去远程处理时间”的一半。
编辑: 函数定期轮询(它是update()函数的一部分,所以第一次可能确实是0)
$(document).ready(function () {
...
setTimeout(function () { update() },2000); }
..
});
一些测试产生了以下示例:
responseTime=(serverClientRequestDiffTime(-578)-NowTimeStamp(1621632913398)+clientTimestamp(1621632913081)-serverClientResponseDiffTime(895))/2=-895
serverDateTimeOffset=(serverClientResponseDiffTime(895)-responseTime(-895))/2=895
通过代理添加请求延迟:
responseTime= (serverClientRequestDiffTime(2456)-NowTimeStamp(1621632992161)+clientTimestamp(1621632988800)-serverClientResponseDiffTime(905))/2= -905
serverDateTimeOffset=(serverClientResponseDiffTime(905)-responseTime(-905))/2=905
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。