Синхронные часы между сервером и клиентом - PullRequest
3 голосов
/ 10 февраля 2012

В моем приложении у меня есть Сервер и x Клиенты.Когда Клиент запускается, он получает текущее Системное время с Сервера.Каждый Клиент должен работать с Серверным временем и не может использовать свое Системное время.

Теперь мой вопрос: Каков наилучший способ запуска часов на клиенте, который запускается с текущего времени сервера и работает почти синхронно с ним, не получая время сервера каждые x секунд?

Цель состоит в том, чтобы отобразить рабочие часы с временем сервера на клиенте.

Допуск, который могут иметь часы клиента, составляет около 1 секунды за 24 часа.1011 *

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

Спасибо за ваш ответ

Ответы [ 3 ]

2 голосов
/ 10 февраля 2012

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

2 голосов
/ 13 февраля 2012

Я нашел решение, которое идеально подходит для моей ситуации. Вместо использования System.currentTimeMillis() я использую System.nanoTime(). System.nanoTime() не зависит от системных часов.

Когда я получаю текущее время Сервера, я дополнительно сохраняю данные из Системы. Затем текущее время сервера будет рассчитываться с разницей между временем нс от времени получения сервера и текущим временем nanoTime плюс время сервера.

Пример:

// The Client starts and receive the current Server time and the nanoTime
private long         serverTime = server.getCurrentTime();
private long         systemNano = System.nanoTime();

//To calculate the current Server time without a service call
                                                                        //ns-> ms
long currentServerTime = serverTime + ((System.nanoTime() - systemNano) / 1000000);

Thx

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

Один из способов сделать это - получить разницу между временем сервера и местным временем и использовать его для расчета времени

  • Клиент запускается и получает время с сервера (я собираюсьпредполагается, что используется текущее время в миллисекундах, но его можно адаптировать к тому, что вы используете)
  • Клиент проверяет свое текущее системное время и сохраняет разницу
  • Затем эту разницу всегда можно применитьтекущее системное время на клиенте для расчета времени сервера

Пример:

long serverTime = 1328860926471l; // 2012/02/10 10:02, received from wherever
long currentTime = System.currentTimeMillis(); // current client time
long difference = currentTime - serverTime;

// Server time can then me retrieved like this:
long currentServerTime = System.currentTimeMillis() - difference;     
Date serverTimeDate = new Date(currentServerTime);

Очевидно, что разница должна сохраняться в момент получения времени сервера.

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