Синхронизация нескольких клиентов - PullRequest
2 голосов
/ 01 февраля 2012

Проблема, с которой я столкнулся, такова: у меня есть N IPad, которые могут вызвать событие. Как узнать на стороне сервера, кто вызвал событие первым. Языки, используемые для серверной части, - это PHP, а для клиентской - JavaScript (JQuery). Самая большая проблема - это задержка, поэтому простая отправка опроса AJAX не будет работать, так как я мог нажать кнопку раньше, чем j, но сервер мог получить запрос j, прежде чем я из-за задержки. Кроме того, экономия времени печати не является оптимальной, поскольку IPad не синхронизируются с точностью до миллисекунд или меньших единиц. Может быть, есть какой-то протокол, который занимается этим, из которого я мог бы получить некоторые идеи?

1 Ответ

1 голос
/ 02 февраля 2012

вот 2 метода, которые вы можете использовать для проверки задержки.

затем вы можете рассчитать время прибытия запроса пользователя

фактическое время запроса = время прибытия запроса - задержка

время прибытия запроса должно быть временем сервера(когда запрос поступает на сервер), поэтому нам не нужно синхронизировать модули.но данные о задержке должны поступать от клиента вместе с данными запроса.Вы должны создать клиентский сценарий для опроса и вычисления среднего времени задержки.


первый метод взят из вопроса здесь в stackoverflow .этот использует AJAX.это самый точный поиск, с отклонением менее 10 мс от фактического.то, что он делает, это вызывает (через ajax) страницу вашего сервера (в этом примере URL-адрес «/» означает ваш веб-корень)

  • преимущество: мы используем jQuery ajax .success()который инициирует событие после получения ответа, но до загрузки данных ответа (таким образом, размер запроса не имеет значения)

  • недостаток: ajax не является междоменным (без помощи).но если у вас есть собственный сервер, никаких проблем.


второй - отсюда , и я немного его изменил.Первоначально он был создан как тестер сервера, чтобы проверить, если сервер все еще там.

  • преимущества: междоменный (мы используем img = new Image() метод "preloader image")

  • недостаток: скорость интернета.Размер полезной нагрузки (в данном случае изображение) и скорость интернета будут иметь значение, поскольку мы используем только .onLoad(), который срабатывает после загрузки контента.

будет отклонение от 200 до 400 мс, в зависимости от размера изображения.

//this is a static class. values are preserved. do resets before and after use.
var ping = {

    //the sample image. make it as small as possible like 1 x 1 px black and white. 
    //we are only testing ping, not download times
    //replace with your own image on your server since this link will die soon
    picture: "http://205.196.122.17/vh8cvmdtgfsg/8nsd22kphe1fz5w/spacer.bmp",

    //placeholder for test subject
    pictureFrame: null,

    //timer
    timer: null,

    reset: function(){
        //clear timeouts and timer
        clearTimeout(ping.timer);
        ping.timer = null;

        //clear the picture frame
        ping.pictureFrame = null;
    },

    //start ping function
    init: function() {

        //reset
        ping.reset();

        //get time before request
        var preSess = new Date();
        var preTime = preSess.getTime();

        //append current timestamp so request won't be from cache
        var pictureUri = ping.picture + "?time=" + preTime; 

        //create placeholder    
        ping.pictureFrame = new Image();
        ping.pictureFrame.onload = function() {

            //get time after load
            var postSess = new Date();
        var postTime = postSess.getTime();
            var requestTime = postTime - preTime;

            alert("Ping took "+requestTime+"ms");

            //reset
        ping.reset();
        };

        //triggers loading
        ping.pictureFrame.src = pictureUri;

        //set maximum timeout (in ms) before we declare domain not there
        ping.timer = setTimeout("ping.failed()", 60000);
    },

    //time-out reached
    failed: function() {
        //reset
        ping.reset();

        //alert what happened
        alert("Ping took too long");
    }
};

ping.init();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...