orologio Sincronizzazione Javascript con l'orologio del server
-
28-09-2019 - |
Domanda
SFONDO
Sto creando un sistema di AJAX chat. Sembra qualcosa di simile a questo:
Mike - hi Jane - 5 minuti fa
Jane - hi Mike - 4 minuti fa
Mike - come va - 3 secondi fa
Jane - buono che sto facendo - 1 ora fa
Javascript interroga il server ogni minuto e gli risponde server con 10 dei messaggi più recenti. In allegato a ciascun messaggio è un timestamp Unix (tempo di PHP ()). Javascript è responsabile per la fusione dei messaggi nel buffer l'utente ha a disposizione con questa nuova risposta del server. L'interleaving dei messaggi e la precisione del "tempo fa X" messaggio dipende dal modo in cui l'orologio Javascript è sincronizzato con l'orologio del server.
DOMANDA
Come aver completato la sincronizzazione l'orologio sia Javascript con l'orologio del server? Qui di seguito è quello che ho finora. Vorrei renderlo più preciso. Attualmente non si considera il tempo di andata e ritorno del Ajax che fa la sincronizzazione. Come faccio a sapere la percentuale di andata e ritorno che sta inviando, lavorazione, e la ricezione? Inoltre, come si fa a trattare con gli utenti che è in cristalli di clock sono semplicemente Busted - per esempio: è 19:20 GMT, ma il loro orologio in realtà dice 19:15 GMT
?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;
}
}
Soluzione
C'è un limite a quanto si può essere precisi, come ho spiegato nel questa risposta - in sostanza, qualsiasi skew inferiore al tempo di richiesta di andata e ritorno non è rilevabile. Se si ha realmente bisogno il momento di essere il più preciso possibile, creare uno speciale tipo di richiesta al server che appena ottiene il tempo, e fare tutto il possibile per rendere l'andata e ritorno il più velocemente possibile.
È possibile identificare i browser i cui orologi locali sono chiaramente folle, però, perché l'ora del server osservata non cadrà tra l'inizio e la fine l'ora locale del richiesta. Dal momento che non si può stringere verso il basso molto più lontano di quello, basta scegliere un tempo arbitrario all'interno della richiesta locale di [start, end] intervallo e trattamento che come equivalente al tempo di server ha ricevuto.
Altri suggerimenti
Abbiamo avuto un problema simile. La nostra soluzione è stata quella di ignorare semplicemente l'orologio del browser. Se i messaggi arrivano con un timestamp del server, appena sorta loro da quella data e ora. Poi tutto quello che dovete fare è nel presentare i dati, solo convertire che in tanto browser. Tutti i calcoli e la selezione si sono basate fuori del tempo del server però. In questo modo, tutto ciò che dovete fare è tenere i server volte tutti sincronizzati.
Usa flash e un server socket. Se avete bisogno di essere accurato al 100%. Ho scritto un server socket per un'applicazione che trasmette il tempo di un elemento flash ogni 1 secondo e gli dice esattamente cosa display.
Si tratta di un'applicazione basata finanziaria in cui ha bisogno di essere sempre accurate al 100%.
Abbiamo inoltre accoppiato in su con FMS essere in grado di tunnel attraverso i firewall aziendali.
Se si utilizza JavaScript non sarà in grado di raggiungere la precisione.
eventualmente html5 risolverà questo problema con prese presto