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 (将#修改为@)