Comment puis-je trouver le temps de réponse (temps de latence) d'un client en NodeJS avec des sockets (socket.io)?
Je suis en train de créer un jeu multijoueur avec NodeJS et je veux synchroniser l'action entre les clients.
Quelle serait la meilleure façon de trouver le temps de latence (le temps qu'une demande pour venir au client) entre le client et le serveur?
Ma première idée était que le client n ° 1 pourrait envoyer un timestamp est la demande, de sorte que lorsque client #2 recevra l'action de la client #1, il va le régler, c'est l'action de la vitesse de supprimer le délai de la demande.
Mais le problème, c'est que peut-être le système date et heure de la deux clients ne sont pas identiques, de sorte qu'il n'est pas possible de deux savoir le rouleau de retard sur la demande de client #1.
L'autre solution était d'utiliser le timestamp du serveur, mais maintenant, comment je sais que la latence de la client?
Vous devez vous connecter pour publier un commentaire.
Je vais supposer que vous utilisez les WebSockets ou Socket.IO puisque vous êtes à la mise en œuvre d'un jeu où la latence des questions (et marqués comme tels).
Je pense que le serveur doit probablement de mesurer et de garder trace de ce pour chaque client.
Vous voulez probablement mettre en œuvre une sorte de ping action que le serveur demande du client. Dès que le client reçoit la demande, il renvoie une réponse au serveur. Le serveur puis divise par 2 et met à jour le temps de latence pour que le client. Vous voulez probablement le serveur pour le faire régulièrement avec chaque client et probablement à la moyenne de la dernière plusieurs de sorte que vous n'obtenez pas le comportement étrange d'un coup de façon temporaire, mais les pointes.
Puis, quand il y a un message d'un client qui doit être envoyé (ou de diffusion) à un autre client, le serveur peut ajouter client1 latence du client2 de latence et de communiquer ce que le temps de latence de décalage du client2 dans le cadre du message. client2 sait alors que l'événement sur client1 est arrivé que le nombre de millisecondes plus tôt.
Une raison de plus de le faire sur le serveur, c'est que certains navigateur Javascript horodatages sont inexactes: http://ejohn.org/blog/accuracy-of-javascript-time/. Je soupçonne node.js les horodatages sont tout aussi précis (ou plus) que les V8 (qui est l'un des rares exacte ones).
Vue d'ensemble:
Après la prise.io connexion a été établie, vous créez un nouveau
Date
objet sur le client, nous allons l'appelerstartTime
. C'est votre temps initial avant de faire une demande au serveur. Vous puis émet unping
événement de la part du client. Convention de nommage est totalement à vous. En attendant, le serveur doit être à l'écoute pour uneping
événement, et quand elle reçoit laping
, il émet immédiatement unpong
événement. Client puis attrape lapong
événement. À ce moment, vous voulez créer un autre objet date qui représenteDate.now()
. Donc, à ce stade, vous avez deux objets date - date initiale avant de faire une demande au serveur, et un autre objet date, après vous faites une demande pour le serveur, et il a répondu. Soustraire lestartTime
le temps courant et vous avez lelatency
.Client
Serveur
Également disponible en tant que Github Gist.
startTime
doit être globale pour que le code fonctionne, juste pour info 🙂 Merci pour ce bien.Ce que j'ai l'habitude de faire pour envoyer timestamp avec la demande de l':
new Date()
et envoyertimestamp: date.getTime()
pour le serveur, à chaque JSON demande.processed: (new Date()).getTime()
dans l'objet.timestamp
de la demande, et un nouveau traité champ:processed: (new Date()).getTime() - req.processed
qui contient le nombre de millisecondes qu'il a fallu pour traiter la demande.timestamp
(qui est la même chose qui a été envoyé sur pt 1) et de la soustraire à l'heure actuelle, et de soustraire le temps de traitement (processed
), et il est votre "réel" du temps de réponse en millisecondes.Je pense que vous devriez toujours inclure le temps pour à la fois la demande et la réponse au ping, même si il ya un moyen de communication. C'est parce que c'est le standard dans le sens de "ping" et "temps de latence". Et si c'est un moyen de communication et le temps de latence n'est que la moitié du réel des temps de ping, c'est juste une "bonne chose".
Après la lecture de toutes ces réponses...
...Je n'étais toujours pas satisfait. J'ai visité l'officiel docs et bien, bien, bien, la solution est déjà intégré.
Vous avez juste besoin de le mettre en œuvre - découvrez la mienne:
Client
Serveur
Heres ma vraiment rapide et sale de script pour tester le ping ... juste la tête pour http://yourserver:8080 dans votre navigateur et de regarder la console (terminal ssh pour moi).
Je suis très curieux à ce sujet car il semble que ma pings sont assez élevés(200-400ms aller-retour) sur des grandes vps boîtes w/consacré des ressources à la fois en californie et le new jersey. (Je suis sur la côte est), je suis de paris il y a juste beaucoup de temps de latence sur le vps cases b/c ils servent donc, beaucoup de trafic?
La chose qui me surprend est qu'un simple ping depuis le terminal linux à partir du même client vers le serveur est 11 ms en moyenne d'un facteur de 10 baisser ... suis-je en train de faire quelque chose de mal ou est quelque chose de lent avec le noeud.js/socket.io/websockets?
À lire en premier — Due à de multiples questions: "pourquoi cela est censé fonctionner, permettez-moi de clarifier un peu.
start
variable contenant le marqueur de temps. C'est l'accusé de réception (argument) dans le support.io.socket.io
permet de définir une fonction de rappel, qui semble être exécutée par le serveur, mais cela fait juste passe les arguments de la fonction à travers le web socket, et le client appelle ensuite la fonction de rappel.Ce qui se passe ci-dessous (s'il vous plaît ne vérifier l'exemple de code!):
1453213686429
dansstart
ping
événement pour le serveur et est en attente d'une réponseclientCallback
avec vide d'arguments (Vérifier le code de démonstration si vous voulez voir des arguments)clientCallback
prend encore le timestamp actuel sur le client, par exemple1453213686449
, et sait que20 ms
ont passé depuis qu'il a envoyé la demande.Imaginer le druide (client) la tenue d'un chronomètre et en appuyant sur le bouton lorsque le messager (événement) commence à s'exécuter, et en appuyant de nouveau lorsque le messager arrive avec son défilement (les arguments de la fonction). Le druide lit ensuite les faire défiler et ajoute les noms des ingrédients de sa recette de potion et prépare la potion. (rappel)
Ok, oubliez le paragraphe précédent, je suppose que vous avez obtenu le point.
Bien que la question a déjà été posée, voici un bref de mise en œuvre pour la vérification de la RTT avec
socket.io
:Client
Serveur
Le Code De Démonstration
Le code de démonstration en tant que nœud du module: socketIO-rappel.tgz à l'installer et l'exécuter avec
puis accédez à http://localhost:5060