1

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

パケットがサーバーから移動するのに、ラウンドトリップ全体よりも時間がかかる可能性があるのはどうしてですか? サーバーとクライアントの時間差によるものだと思います。それは何だと思いますか?

4

1 に答える 1

1

これが起こる理由はたくさんあります。ただし、プログラミングをテストする場合は、結果を traceroute (Linux のコマンド) などと比較する必要があります。

物事は常にローカルで WAYYY より速くなります。LAN の外にあるものにアクセスすると、あらゆる種類のオーバーヘッドと遅延が発生します。

単純な traceroute でおそらく多くのことを説明できます。また、ここから行うこともできます:

http://www.traceroute.org/

//編集//

これを行う方法はたくさんあります。次のリンクを確認してください。

ブラウザからの遅延/Ping テスト

しかし、根底にある原則は、複数のメッセージを送信することです。最初の要求応答メッセージを使用して、時間を計算できます。私は約 1000 のクライアントでこれを行っており、それぞれのオフフェストを追跡しています。オフセットを計算したら (つまり、クライアントはサーバーより 1 時間進んでいます)、遅延の計算からそれを差し引くことができます。このphp関数をチェックしてください

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

それは少なくとも正しい方向に向けるのに役立つはずです:)-さらに助けが必要な場合はお知らせください。

于 2012-08-19T10:07:21.443 に答える