Как выполнить ping в JavaScript или jQuery?

Я хочу создать игровой пинг в Javascript, как, например, в игре Counter Strike. Я делаю вызов AJAX на сервере (MySQL) и хочу рассчитать время, которое было принято, но я либо неправильно его вычисляю, либо ошибочно Вот код, который у меня есть до сих пор:

var time_stamp = new Date;

$.ajax({ type: "POST",
    url: "server.php",
    data: {....},
    success: function(output){ 

        ping = new Date - time_stamp;

    }
}); // btw, this code works fine now for ping

Проблема в том, что иногда я получаю 0мс или 3 мс. Это нормально? Кажется очень быстрым перейти к server.php, подключиться к базе данных, выбрать несколько строк и вернуть некоторые данные. Да, это на локальном хосте, поэтому он должен быть быстрым, но нужно ли это так быстро? Должен ли я вычислять его при FPS или только каждый вызов server.php?

Ответ 1

более низкое время ответа связано с тем, что по умолчанию для свойства cache установлено значение true, установите его на false, чтобы каждый раз, когда он перешел на сервер, а не в кеш

var ping = new Date;

$.ajax({ type: "POST",
    url: "server.php",
    data: {....},
    cache:false,
    success: function(output){ 

        ping = new Date - ping;

    }
});

Ответ 2

Вы не сможете вычислить точную задержку на стороне клиента (не считая java, flash или websockets), вам нужен сервер, чтобы вычислить его и вернуть значение в ответе. Получение чего-либо, кроме 0ms для локального хоста, должно быть достаточным доказательством этого: P

Самое раннее время в состоянии соединения получает 300ms для stackoverflow.com, а действительное число ближе к 100ms.

var a = new XMLHttpRequest();

a.onreadystatechange = function () {

    if (a.readyState === a.HEADERS_RECEIVED) {
        a.abort();
        console.log(new Date - abc);
    }
};

var abc = new Date;

a.open("GET", "/");
a.send(null);

Ожидание полного ответа (a.DONE) заняло 949ms