2017-02-07 2 views
0

Ich möchte den Unterschied zwischen dem Javascript-Client und jedem von der App angeforderten Server (der lokal, aber auch remote sein kann) ziemlich genau berechnen (in der Reihenfolge einer Sekunde). Ziel ist es, Kurzzeitablaufmarken liefern zu können.Kann ich die Anfragezeit berücksichtigen, um den Zeitunterschied zwischen JS-Client und Server zu erhalten?

Ich kann beide Zeiten, sowie einen Server-Zeitstempel in der HTML-Seite injizieren, um eine Referenz zum Vergleich zu erhalten.

Gibt es jedoch eine einfache Möglichkeit, die Zeit zu berücksichtigen, die der Client benötigt, um den Server zu erreichen, und zurück, so dass der Zeitunterschied genau sein kann? Interessiert zu wissen, auch wenn Sie Gründe haben, diese Art der Dinge nicht zu verwenden.

Wenn die Antwort eine Möglichkeit ist, Variablen zu berechnen, können Sie Ihre Erklärung einfach halten und nur die Variablen angeben, nicht zu schreiben der ganze Code.

Thx.

Antwort

1

Meine Antwort ist ein wenig allgemein und hängt davon ab, was genau Sie tun möchten.

Zunächst müssen Sie berücksichtigen, dass der Server und der Client nicht die gleiche Zeit haben, ein Client möglicherweise nicht einmal das richtige Datum haben, so sollten alle Javascript-Zeitstempel im Unterschied zu einem gespeichert werden relativer Punkt.

mit Ajax für jede Anfrage kann einfacher für Sie (Sie einfach Daten über die Verbindung sammeln können)

Abschätzen der Serverzeit

Das Hauptproblem hier ist die Internetverbindung oder wenn der Server einige schwere Arbeit, die Server-Ausführungszeit.

Sie können die Zeit zum "Ping" des Servers messen, indem Sie eine normale Anfrage an den Server stellen und die Zeit angeben, zu der die Anfrage zugestellt wurde.

var start = new Date().getTime(); 
// Make the request 
var ping_time = new Date().getTime() - start; 

Die Anfrage dauert ca. ping_time/2 durch den Server und ping_time/2 für den Client die Antwort zu bekommen servered werden.

Sie können auch den Server mit der Zeit in Zeitstempel auf diese Anfrage reagieren lassen (der Zeitstempel in Ajax ist aufgrund des kleinen Inhalts schneller). Um die Serverzeit finden zu können.

var start = new Date().getTime(); 
// Make the request 
var serverTime = request_responce; 
var ping_time = new Date().getTime() - start; 
// Estimate server's time 
server_time_now = serverTime + (ping_time/2); 

Um können Sie auch mit dem server_time_now der client_time_now = new Date().getTime() speichern, um den Server in der Zukunft abzuschätzen. Und machen Sie eine Funktion, um den Unterschied zu berechnen.

function getServerTimeEstimation(){ 
    return server_time_now + (new Date().getTime() - client_time_now); 
} 

Jetzt haben Sie eine Schätzung der Serverzeit haben, können Sie auch die Serverzeit Schätzung Remake und überprüfen, ob Sie über die gleiche Schätzung bekam (nur zu prüfen, ob die Einschätzung richtig war).

Estimate ping

Ein anderes Problem ist, dass für die kurze Zeit, Zeitstempel können Sie eine feste Anzahl von ms verwenden oder die Schätzung des Ping verwenden. Durch die Verwendung einer festen Anzahl von ms (zB 5 * 1000 = 5 Sekunden) können Probleme auftreten, wenn ein Benutzer eine langsame Verbindung hat.

// Short time timestamp 
stt = getServerTimeEstimation() + (5*1000) 

Wenn Sie ex verwenden. 5 * Ping kann es besser sein, aber Sie brauchen, um die Ping-Tracking

// Short time timestamp 
stt = getServerTimeEstimation() + (5*ping) 

So müssen Sie möglicherweise einen Ajax-Wrapper sorgen, dass der Ping jedes Mal messen und hält sie aktualisiert wird.

// Measure new ping 
new_ping = ...; 
// Adjust ping a little 
ping = ping * 0.7 + new_ping * 0.3; 
+0

danke, ich dachte über Timing Unterschiede auf beiden Seiten, aber überraschenderweise nicht über das Senden eines Ping nur dafür. Ich warte ein wenig mehr, bevor ich die Antwort akzeptiere, aber es hat geholfen. Um genau zu sein, betrifft das 2 verschiedene Projekte, eines, in dem ich ein Echtzeit-Spiel machen möchte, das Turn-Dauer an Speed-Connexion anpasst. Für die Sekunde ist es für die Arbeit und viel komplizierter, und ich könnte nicht in der Lage sein, wegen der Verbindung zu implementieren, die instabil ist. Ich werde vielleicht aktualisieren. Danke nochmal! – Kaddath

Verwandte Themen