Цитата:
начальная установка
клиент дай время -
сервер 9.59
опрос:
клиент - моё время 10.00
сервер - моё 10.02
клиент - ага разница 2 секунды /2 = 1 секунда
устанавливаем время на 10.03
...
клиент моё время 10.05
сервер моё - 10.09
клиент: ага разница 4 секунды /2= 2
устанавливаем время на 10.11
|

Код AS3:
package
{
/**
* Синхронизация с серверным таймером
* @author k0t0vich
*/
public class SynchroTimer
{
private var delta:int;
private var answerTime:int;
private var syncTime:int;
private var savedTime:int;
/**
* обработчик данных от сервера - начальное время
* @param serverTime
*/
public function onStartTime(serverTime:int)
{
syncTime = serverTime;
savedTime = getTimer();
}
/**
* обработчик данных от сервера - текущее время
* @param serverTime
*/
public function onServerTime(serverTime:int):void
{
delta = (serverTime-answerTime)/2;
syncTime = serverTime + delta;
savedTime = getTimer();
}
/**
* Текущее синхронизированное время
*/
public function get time():int
{
var ret:int = getTimer() - savedTime + syncTime;
return ret;
}
public function getServerTime():void
{
answerTime = time;
///// послыаем запрос на сервер
//..
}
public function getSatrtServerTime():void
{
answerTime = getTimer();
///// послыаем запрос на сервер
//..
}
}
}
в этой схеме предполагается что вопрос и ответ шлются одинаковое время, что на самом деле не всегда правда, но такая схема позволяет немного нивелировать ошибку, да и разница в 1-2 секунды в случае аукциона наверное не очень существенна, хотя в каких нибудь реалтайм стрелалках прилиична, но в этом случае поможет только сокет.