Синхронизация часов Javascript с часами сервера - PullRequest
3 голосов
/ 25 ноября 2010

ФОН

Я создаю систему чата AJAX. Это выглядит примерно так:

Майк - привет Джейн - 5 минут назад

Джейн - привет, Майк - 4 минуты назад

Майк - как дела - 3 секунды назад

Джейн - У меня все хорошо - 1 секунду назад

Javascript опрашивает сервер каждую минуту, и сервер отвечает 10 самыми новыми сообщениями. К каждому сообщению прикреплена метка времени Unix (PHP time ()). Javascript отвечает за объединение буферизованных сообщений, которые пользователь в настоящее время имеет, с этим новым ответом сервера. Чередование сообщений и точность сообщения «X time ago» зависит от того, насколько хорошо часы Javascript синхронизированы с часами сервера.


ВОПРОС

Как вы точно синхронизируете часы Javascript с часами сервера? Ниже то, что я имею до сих пор. Я хотел бы сделать это более точным. В настоящее время он не учитывает время приема-передачи Ajax, которое выполняет синхронизацию. Как мне узнать, какая часть туда и обратно отправляет, обрабатывает и получает? Кроме того, как вы справляетесь с пользователями, чьи кристаллы часов просто обанкротились - например: сейчас 7:20 вечера по Гринвичу, но на самом деле их часы показывают 7:15 вечера по Гринвичу?

Clock = {
   serverOffset = 0;

   synch: function() {
      new Ajax.Request(
         '/getServerTime.php', {
            onSuccess: function(transport) {
               this.serverOffset = parseInt(transport.responseText) - 
                  new Date().getTime() / 1000;
            }
         }
      );
   },

   getServerTime: function(myTime) {
      if (typeof(myTime) === 'undefined') {
         myTime = new Date().getTime() / 1000;
      }
      return myTime + this.serverOffset;
   },

   serverToMyTime: function(serverTime) {
      return serverTime - this.serverOffset;
   }
}

Ответы [ 3 ]

3 голосов
/ 25 ноября 2010

Существует предел вашей точности, как я объяснил в в этом ответе - по сути, любое отклонение часов меньше, чем время запроса в обоих направлениях, невозможно обнаружить.Если вам действительно нужно время, чтобы быть как можно более точным, создайте специальный тип запроса для сервера, который просто получает время, и сделайте все возможное, чтобы совершить круговое путешествие как можно быстрее.

Выможет идентифицировать браузеры, чьи локальные часы явно безумны, потому что наблюдаемое время сервера не будет находиться между локальным временем начала и конца запроса.Поскольку вы не можете ужесточить его намного дальше, просто выберите произвольное время в пределах локального интервала запроса [начало, конец] и рассматривайте его как эквивалентное полученному времени сервера.

3 голосов
/ 25 ноября 2010

У нас была похожая проблема. Нашим решением было просто игнорировать часы браузера. Если сообщения приходят с отметкой времени сервера, просто отсортируйте их по этой отметке времени. Тогда все, что вам нужно сделать, это при представлении данных, просто конвертировать это время браузера. Все расчеты и сортировка были основаны на серверном времени. Таким образом, все, что вам нужно сделать, - это синхронизировать время всех ваших серверов.

1 голос
/ 21 июня 2011

Используйте флеш и сокет сервер. Если вам нужно быть на 100% точным. Я написал сервер сокетов для приложения, которое передает время на флэш-элемент каждую 1 секунду и сообщает, что именно отображать.

Это финансовое приложение, в котором оно должно быть на 100% точным.

Мы также подключили его к FMS для туннелирования через корпоративные брандмауэры.

Если вы используете javascript, вы не сможете достичь точности.

возможно, html5 скоро решит эту проблему с сокетами

...