【问题标题】:Server Time and Client Time -- Difference?服务器时间和客户端时间——差异?
【发布时间】:2012-08-20 19:38:06
【问题描述】:

我编写了一个代码,告诉我一个数据包从server to client 到达所花费的时间,以及从client to server to client 再次到达所花费的总时间。这是我的代码。

客户端:

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Ping</title>
<script src="/socket.io/socket.io.js"></script>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>
$(document).ready(function(e) {

    var socket = io.connect('http://pingme.jit.su:80/', {secure: false});
    $('#button').click(function(e) {
        e.preventDefault();
        $(this).attr('disabled','disabled');
        var time = (new Date()).getTime();
        socket.emit('ping', time);  
    });
    socket.on('pong', function(data)    {
        var time2 = (new Date()).getTime();
        var lat = time2 - data.server;
        var roundtrip = time2 - data.init;
        var str = '<br><br><strong>From Server</strong>: '+lat+' ms<br><strong>Roundtrip</strong>: '+roundtrip+' ms<br><br>';
        $('#res').prepend(str);
        $('#button').removeAttr('disabled');
    }); 
});
</script>
</head>
<body style="margin:0;">
<input type="button" name="Button" id="button" value="Latency">
<div id="res"></div>
</body>
</html>

服务器端:

var app = require('http').createServer(handler)
, io = require('socket.io').listen(app)
, fs = require('fs')
, path = require('path')
, url = require("url")
, querystring = require("querystring");

app.listen(8080);

io.configure('development', function(){
  io.set('transports', ['xhr-polling']);
});

io.configure('production', function(){
  io.set('transports', ['xhr-polling']);
});

var static = require('node-static');
var fileServer = new static.Server('.', { cache: false });

function handler (request, response) {

    var pathname = url.parse(request.url).pathname;
    if(pathname == '/') {
        pathname = '/app.html';
    }   
    request.addListener('end', function () {
        fileServer.serveFile(pathname, 200, {}, request, response, function(err, result)    {
            if(err) {
                console.log(err);
                console.log(err.status);
            }
            else
                console.log(result);                
        });
    });
}

io.sockets.on('connection', function (socket) {
    socket.on('ping',function(data) {
        var time = (new Date()).getTime();
        socket.emit('pong', {server:time, init:data});
    });

});

这个问题在本地运行良好,显示以下输出:

From Server: 4 ms
Roundtrip: 11 ms

From Server: 10 ms
Roundtrip: 15 ms

在 Nodejitsu 上部署后运行时出现异常结果。它给了我以下输出:

From Server: 2223 ms
Roundtrip: 956 ms

From Server: 2265 ms
Roundtrip: 915 ms

数据包从服务器传输的时间怎么可能比整个往返时间长?我认为这是由于服务器和客户端之间的时间差异。你觉得是什么?

【问题讨论】:

    标签: node.js socket.io


    【解决方案1】:

    发生这种情况的原因有很多。但是如果你想测试你的编程,那么你应该将结果与类似 traceroute(Linux 上的命令)的结果进行比较。

    在本地,事情总是会变得更快。当您访问 LAN 外部的内容时,您将获得各种开销和延迟。

    一个简单的 traceroute 可能会解释很多。另外,您可以从这里进行:

    http://www.traceroute.org/

    //编辑//

    有很多方法可以做到这一点,请查看此链接:

    Latency / Ping test from Browser

    但基本原则是您发送多条消息。您可以使用您的第一个请求-响应消息来计算时间。我对大约 1000 个客户执行此操作,我所做的是跟踪每个客户的 offest。一旦计算出偏移量(即客户端比服务器早 1 小时),您就可以从延迟计算中减去它。看看这个 php 函数

    http://php.net/manual/en/function.timezone-offset-get.php

    这至少应该可以帮助您指出正确的方向 :) - 如果您需要更多帮助,请告诉我。

    【讨论】:

    • 感谢您的链接。但问题不在于延迟。问题在于同一时刻服务器和客户端的时间戳不同。有什么方法可以让客户端和服务器都使用第三方通用时钟??
    • 当我这样做时,我通常会在实际消息中发送客户端时间戳并以这种方式进行计算。这意味着您可以在进行计算之前计算出服务器和客户端时间之间的偏移/差异。或者您可以先尝试同步时钟。我不知道任何通用时钟,但我知道你可以让它们在同一个时间服务器上同步
    • 好吧,您无法控制服务器是吗?如果这样做,您可以使用命令将 unix 时间与 NTP 服务器同步。请参阅此站点:unixsurgeon.com/kb/… - 否则,如果您无法通过 nodejitsu 访问,那么您应该在实际消息中发送时间戳并计算出时差。
    • 哦,我明白了,您的浏览器有调试栏/firebug 或 chrome 调试器吗?如果是这样,请查看您站点的 XHR 请求,并将它们与此站点进行比较:pingtest.net --- 我认为您需要做的是发送不止一条消息,并计算出平均值。我将编辑我的主要答案以解释更多
    • 您应该能够从客户端的 javascript 中检测到这一点。只需跟踪客户的时钟,如果它变化太大,那么你就知道他们已经改变了它。如果您每 5 秒检查一次客户时间,并且自上次检查以来它已经更改了 10 秒,那么您知道他们已经将时钟更改了 5 秒。
    猜你喜欢
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多