2012-01-22 15 views
10

Chcę utworzyć ping podobny do gry w JavaScript, tak jak na przykład gra Counter Strike. Robię wywołanie AJAX do serwera (MySQL) i chcę obliczyć czas, który jest zajęty, ale albo obliczam to źle, albo mam zły pomysł pingowania. Oto kod, który mam do tej pory:Jak pingować w JavaScript lub jQuery?

var time_stamp = new Date; 

$.ajax({ type: "POST", 
    url: "server.php", 
    data: {....}, 
    success: function(output){ 

     ping = new Date - time_stamp; 

    } 
}); // btw, this code works fine now for ping 

Problem polega na tym, że czasami otrzymuję 0ms lub 3ms. Czy to w porządku? Bardzo szybko można przejść do server.php, połączyć się z bazą danych, wybrać niektóre wiersze i zwrócić niektóre dane. Tak, to jest na localhost, więc powinno być szybko, ale czy ma być tak szybki? Czy powinienem obliczać to na FPS, czy po prostu każde połączenie z server.php?

+0

myślę, że to jest w porządku. Spróbuj uzyskać dane wyjściowe z 'server.php', jeśli odpowiedzi są w porządku, jest OK :) jeśli używasz Chrome lub Firebug, spójrz na czas żądania ajax. –

+1

Upewnij się, że serwer WWW wysyła nagłówki na serwerze.php, aby zapobiec buforowaniu. –

+0

Dziękuję za pomoc. Sprawdziłem, a Chrome daje mi o 1 ms mniej niż moje obliczenia, co jest w porządku. – Kivylius

Odpowiedz

7

czas niższy odpowiedź ponieważ domyślnie własnością cache jest ustawiony na true, ustaw ją na false tak, że za każdym razem udaje się do nie serwer cache

var ping = new Date; 

$.ajax({ type: "POST", 
    url: "server.php", 
    data: {....}, 
    cache:false, 
    success: function(output){ 

     ping = new Date - ping; 

    } 
}); 
2

Nie będzie w stanie obliczyć dokładne opóźnienie po stronie klienta (nie licząc java, flash lub websockets), potrzebujesz serwera, aby go obliczyć i zwrócić wartość w odpowiedzi. Pierwsze coś innego niż 0ms dla localhost powinna być wystarczająco dowodów na to: P

Najkrótszy czas w stanie połączenia dostaje mi 300ms dla stackoverflow.com, podczas gdy rzeczywista liczba jest bliższa 100ms.

var a = new XMLHttpRequest(); 

a.onreadystatechange = function() { 

    if (a.readyState === a.HEADERS_RECEIVED) { 
     a.abort(); 
     console.log(new Date - abc); 
    } 
}; 

var abc = new Date; 

a.open("GET", "/"); 
a.send(null); 

Oczekiwanie na pełnej odpowiedzi (a.DONE) wziął 949ms

Powiązane problemy