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;
   }
}
È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top