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